首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护使用SDK构建的JS应用程序

保护使用SDK构建的JS应用程序
EN

Stack Overflow用户
提问于 2020-04-06 11:03:31
回答 2查看 546关注 0票数 3

我正在按照developers.sap.com的教程学习Javascript:开始使用用于JavaScript的SDK

我创建我的应用程序时:

代码语言:javascript
复制
sap-cloud-sdk init my-sdk-project

现在我想向它添加安全性,具体来说,我想使用app路由器访问应用程序,并且我想直接阻止对服务的任何未经身份验证的请求。可选地,我想包括我的应用程序的不同端点的作用域。

添加应用程序没有任何问题,但是当涉及到保护节点应用程序时,我似乎找不到正确的方法。

我只能找到一些例子,说明如何使用下面这些基本的快速节点应用程序来保护应用程序:

使用NodeJS的Hello示例

node.js你好世界

但它们的结构与sap-cloud-sdk工具提供的结构不同,后者使用nestjs。如果您使用的是Nestjs,帮助门户也不会指向任何示例集。

是否有任何资源、教程或示例可以帮助我在脚手架应用程序中实现安全性?

凯帕尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-06 12:35:40

目前还没有关于如何使用Cloud为JS设置Cloud的资源,但我在过去对它做了一些修改,得到了以下结果。

免责声明:,这绝对不是生产准备代码!请仅以此为灵感,并通过测试和添加健壮的错误处理来验证您的所有行为!

  1. 引入一个具有以下内容的scopes.decorator.ts文件: 从‘@nestjs/ import’导入{ SetMetadata };导出const ScopesMetadataKey =‘作用域’;导出const = (...scopes: string[]) => SetMetadata(ScopesMetadataKey,作用域); 这将创建一个注释,您可以在后续步骤中将其添加到控制器方法中。给定的参数将是端点调用之前所需的作用域。
  2. 创建一个卫队scopes.guard.ts,如下所示: 从‘@nestjs/公用’导入{ CanActivate,ExecutionContext,可注入};从‘@nestjs/core’导入{ Reflector };从‘@sap/cloud-sdk-core’导入{ retrieveJwt,verifyJwt };从‘@sap/xsenv’导入{ getServices };从‘@sap/xsenv’导入{ ScopesMetadataKey };从./sap.装饰器导入{ScopesMetadataKey};@ Injectable ()导出类ScopesGuard实现CanActivate {私有xsappname;构造函数(私有只读反射器:反射器){ this.xsappname = getServices({ uaa:{getServices:'xsuaa‘}).uaa.xsappname;}异步this.reflector.get(ScopesMetadataKey,canActivate(上下文: ExecutionContext):承诺{ const作用域=context.getHandler();if (!作用域){返回真;} const请求= context.switchToHttp().getRequest();const encodedJwt =retrieveJwt(请求);if (!encodedJwt) {返回false;} const =等待verifyJwt(encodedJwt);返回this.matchScopes(作用域,jwt.scope);}私有matchScopes(expectedScopes: string[],givenScopes: string[]):布尔{ const givenSet =新集(GivenScopes);返回expectedScopes.every(范围=> givenSet.has(this.xsappname + '.‘’+范围));} 应该在所有端点之前调用这个卫队,并验证传入的JWT中是否存在所有所需的作用域。
  3. 将保护添加到嵌套应用程序设置中: 从‘@nestjs/core’导入{ Reflector };从‘./auth/作用域.卫士’导入{ ScopesGuard };// .const app = ..。App.get(反射镜)app.useGlobalGuards(新的ScopesGuard(反射器));// . 这将确保所有传入的请求实际上都由上面的守卫“保护”。
  4. 使用在保护有价值的端点的第一步中创建的注释: 导入{ Controller,从‘@nestjs/ return’导入{ Scopes };从‘./auth/作用域装饰’导入{Scopes};从‘/api/rest/foo’导出类FooController {构造函数(私有只读fooService: FooService) {} @ Get () @Scopes('FooViewer') getFoos():Promise {返回this.fooService.getFoos();}} 只有在提供了具有所需作用域的JWT时,才能调用此端点。
票数 6
EN

Stack Overflow用户

发布于 2020-07-08 13:34:26

您可以在sap-cloud-sdk/nest.js项目中使用标准的nodejs身份验证实现,而无需创建任何中间件。由于作为@sap/xssec一部分的JWTStrategy具有中间件实现,所以事情非常简单。

  1. 对于身份验证更改,main.ts

代码语言:javascript
复制
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

import { getServices } from '@sap/xsenv';
const xsuaa = getServices({ xsuaa: { tag: 'xsuaa' } }).xsuaa;

import * as passport from 'passport';
import { JWTStrategy } from '@sap/xssec';
passport.use(new JWTStrategy(xsuaa));

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(passport.initialize());
  app.use(passport.authenticate('JWT', { session: false }));
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

这将初始化中间件。2.范围检查和授权

代码语言:javascript
复制
import { Controller, Get, Req, HttpException, HttpStatus } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
  constructor(private readonly appService: AppService) { }

  @Get()
  getHello(@Req() req: any): any {
    console.log(req.authInfo);
    const isAuthorized = req.authInfo.checkLocalScope('YourScope');
    if (isAuthorized) {
      return req.user;
    } else {
      return new HttpException('Forbidden', HttpStatus.FORBIDDEN);
    }
    // return this.appService.getHello();
  }
}

有关详细信息,请参阅

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61058308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档