Passport-Azure-Ad, кажется, работает асинхронно (все еще) - PullRequest
0 голосов
/ 05 июня 2019

Традиционный способ запуска стратегий 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, кажется, работает асинхронно , но мне нужно было упростить вопрос,Кроме того, я написал ответ, который оказался не совсем правильным, но хотел оставить его, добавив к вопросу.В целом это становилось беспорядком, так что казалось, что было легче закрыть старый и начать новый.

...