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
运行.
的核心思想
我创建了一个简单的 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
运行.