Loopback 4 身份验证元数据选项未定义

Loopback 4 authentication metadata options undefined

我创建了一个简单的 jwt 身份验证应用程序,其显示方式与此处显示的相同:https://github.com/raymondfeng/loopback4-example-auth0

身份验证部分工作正常,但授权未按预期工作。

我用以下函数装饰了我的控制器并添加了一个范围。

@authenticate({strategy: 'auth0-jwt', options: {scopes: ['greet']}})

在我的身份验证策略中,我通过 AuthenticationMetadata class 检查范围。

import {AuthenticationBindings, AuthenticationMetadata, AuthenticationStrategy} from '@loopback/authentication';
import {inject} from '@loopback/core';
import {ExpressRequestHandler, Request, Response, RestBindings} from '@loopback/rest';
import {UserProfile} from '@loopback/security';
import {JWT_SERVICE} from './types';

const jwtAuthz = require('express-jwt-authz');

export class JWTAuthenticationStrategy implements AuthenticationStrategy {
  name = 'auth0-jwt';

  constructor(
    @inject(RestBindings.Http.RESPONSE)
    private response: Response,
    @inject(AuthenticationBindings.METADATA)
    private metadata: AuthenticationMetadata,
    @inject(JWT_SERVICE)
    private jwtCheck: ExpressRequestHandler,
  ) {}

  async authenticate(request: Request): Promise<UserProfile | undefined> {
    return new Promise<UserProfile | undefined>((resolve, reject) => {
      this.jwtCheck(request, this.response, (err: unknown) => {
        if (err) {
          console.error(err);
          reject(err);
          return;
        }
        console.log(this.metadata.options);
        // If the `@authenticate` requires `scopes` check
        if (this.metadata.options?.scopes) {
          jwtAuthz(this.metadata.options!.scopes, {failWithError: true})(request, this.response, (err2?: Error) => {
            if (err2) {
              console.error(err2);
              reject(err2);
              return;
            }
            // eslint-disable-next-line @typescript-eslint/no-explicit-any
            resolve((request as any).user);
          });
        } else {
          // eslint-disable-next-line @typescript-eslint/no-explicit-any
          resolve((request as any).user);
        }
      });
    });
  }
}

尝试访问时

this.metadata.options

我总是得到一个不确定的回报。

如何实现从元数据中获取选项和范围?

谢谢

对于环回授权,您的 class 需要实现 Provider<Authorizer> 接口。在该接口中,它定义了您需要实现的 2 个函数

@injectable({scope: BindingScope.TRANSIENT})
class AuthorizationService implements Provider<Authorizer>{

  value (): Authorizer {
    return this.authorize.bind(this);  
  }

  async authorize (
    context: AuthorizationContext,
    metadata: AuthorizationMetadata,
  ) {
     // TODO implement authorization
  }

}

授权元数据将在您使用 AuthorizationTags.Authorizer

绑定后通过环回自动注入该函数

如果您在实施 Authentication 时遇到问题,请阅读我的 step by step guide,了解我们如何使用 Firebase 实施环回身份验证。那应该可以帮助你得到Authentication运行.

的核心思想