Традиционный способ запуска стратегий Passport в промежуточном программном обеспечении nodejs express:
server.get('/api/tasks', passport.authenticate('oauth-bearer', { session: false }));
Я использую https://tsed.io, («декораторы машинописного текста») и ссылаюсь на эту стратегию паспорта, это делается так::
class MyCtrl {
@Get('/api/tasks')
@UseBefore(passport.authenticate('oauth-bearer', { session: false }))
get() {
...
}
}
Это прекрасно работает.
Вы также можете запустить его как отдельное промежуточное ПО.Что-то вроде:
@Post('/search')
@CustomAuth({role: 'admin', scope: ['admin']})
async search(@Req() request: Req, @BodyParams() query: TranslationApiQuery): Promise<TranslationApiModel[]> {
...
export function CustomAuth(options = {}): Function {
return applyDecorators(
UseAuth(CustomAuthMiddleware),
...
@Middleware()
export class CustomAuthMiddleware implements IMiddleware {
public use(
@Req() request: Express.Request, @Res() response: Express.Response, @EndpointInfo() endpoint: EndpointInfo,
@Next() next: Express.NextFunction) {
// retrieve options given to the decorator
const options = endpoint.get(CustomAuthMiddleware) || {};
Passport.authenticate('oauth-bearer', {session: false}})(request, response, next);
...
, который я пытался использовать, чтобы получить доступ к roles and scopes
, определенному на конечной точке.Но это использование passport.authenticate
не работает.https://github.com/AzureAD/passport-azure-ad/blob/dev/lib/bearerstrategy.js использует async.waterfall (), и это вызывает асинхронное поведение.Но не возвращает обещание, поэтому ждать его нельзя.
Я не понимаю, почему традиционное использование passport.authenticate
работает.Может кто-нибудь объяснить, почему?Есть ли простой способ обойти это (без переписывания bearerstrategy.js
)?Может ли bearerstrategy.js
быть легко переписан, чтобы разрешить оба варианта использования?
У меня изначально был этот вопрос на Passport-Azure-Ad, кажется, работает асинхронно , но мне нужно было упростить вопрос,Кроме того, я написал ответ, который оказался не совсем правильным, но хотел оставить его, добавив к вопросу.В целом это становилось беспорядком, так что казалось, что было легче закрыть старый и начать новый.