gpt4 book ai didi

javascript - 保护使用 SAP Cloud SDK 构建的 JS 应用程序

转载 作者:行者123 更新时间:2023-12-01 15:53:54 26 4
gpt4 key购买 nike

我正在关注 developer.sap.com 上的 Javascript 教程: Get Started with SAP Cloud SDK for JavaScript .

我创建了我的应用程序:

sap-cloud-sdk init my-sdk-project

现在我想为其添加安全性,具体来说,我想使用 approuter 来访问应用程序,并且我想直接阻止对服务的任何未经身份验证的请求。或者,我想为我的应用程序的不同端点包括范围。

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

我只能找到使用以下基本 express 节点应用程序保护应用程序的示例:

Hello World Sample using NodeJS

node.js Hello World

但它们的结构与 sap-cloud-sdk 工具提供的结构不同,该工具使用 nestjsHelp Portal如果您使用的是 Nestjs,也不会指向任何示例。

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

氪,保持对

最佳答案

目前还没有关于如何使用 Cloud SDK for JS 设置 Cloud Foundry 安全性的资源,但我过去对其进行了一些修改,结果如下。

免责声明:这绝不是生产就绪代码!请将此仅作为灵感,并通过测试以及添加强大的错误处理来验证您的所有行为!

  1. 引入一个scopes.decorator.ts文件,内容如下:

    import { SetMetadata } from '@nestjs/common';

    export const ScopesMetadataKey = 'scopes';
    export const Scopes = (...scopes: string[]) => SetMetadata(ScopesMetadataKey, scopes);

    这将创建一个注释,您可以在后续步骤中将其添加到 Controller 方法中。给定的参数将是端点在被调用之前需要的范围。

  2. 创建一个 Guard scopes.guard.ts,如下所示:

    import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
    import { Reflector } from '@nestjs/core';
    import { retrieveJwt, verifyJwt } from '@sap/cloud-sdk-core';
    import { getServices } from '@sap/xsenv';
    import { ScopesMetadataKey } from './scopes.decorator';

    @Injectable()
    export class ScopesGuard implements CanActivate {
    private xsappname;
    constructor(private readonly reflector: Reflector) {
    this.xsappname = getServices({ uaa: { label: 'xsuaa' } }).uaa.xsappname;
    }

    async canActivate(context: ExecutionContext): Promise<boolean> {
    const scopes = this.reflector.get<string[]>(ScopesMetadataKey, context.getHandler());
    if (!scopes) {
    return true;
    }

    const request = context.switchToHttp().getRequest();
    const encodedJwt = retrieveJwt(request);
    if (!encodedJwt) {
    return false;
    }

    const jwt = await verifyJwt(encodedJwt);
    return this.matchScopes(scopes, jwt.scope);
    }

    private matchScopes(expectedScopes: string[], givenScopes: string[]): boolean {
    const givenSet = new Set(givenScopes);
    return expectedScopes.every(scope => givenSet.has(this.xsappname + '.' + scope));
    }
    }

    应在所有端点之前调用此 Guard,并验证传入 JWT 中是否存在所有需要的范围。

  3. 将防护添加到您的 Nest 应用程序设置中:

    import { Reflector } from '@nestjs/core';
    import { ScopesGuard } from './auth/scopes.guard';

    // ...
    const app = ...
    const reflector = app.get(Reflector)
    app.useGlobalGuards(new ScopesGuard(reflector));
    // ...

    这可以确保所有传入的请求实际上都由上面的守卫“守卫”。

  4. 在您的值得保护的端点上使用第一步中创建的注释:

    import { Controller, Get } from '@nestjs/common';
    import { Scopes } from '../auth/scopes.decorator';

    @Controller('/api/rest/foo')
    export class FooController {
    constructor(private readonly fooService: FooService) {}

    @Get()
    @Scopes('FooViewer')
    getFoos(): Promise<Foo[]> {
    return this.fooService.getFoos();
    }
    }

    此端点现在仅在提供具有所需范围的 JWT 时才可调用。

关于javascript - 保护使用 SAP Cloud SDK 构建的 JS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61058308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com