Как инкапсулировать Коа-Паспорт? - PullRequest
0 голосов
/ 15 января 2019

Возможно, это очень простой ответ, но с моим кодом что-то не так. Вот что я хочу сделать.

Я создал приложение koa2 с использованием koa-passport и хочу инкапсулировать использование Passport в классе AuthAdapter (сокращено ниже).

class AuthAdapter {
    setup(koaApp) {
        koaApp.use(passport.initialize());

        passport.use('http-bearer', new PassportHttpBearerStrategy(function(token, done) {
            koaApp.log.info('passport: payload request', token);
            return done(null, { clientId: 1 });
        }));
    }

    async authroute(ctx, next) {
        return passport.authenticate('http-bearer', (error, user, info) => {
            if (error) {
                ctx.throw(500, 'Authentication Error');
            } if (!user) {
                ctx.throw(403, 'Authentication Forbidden');
            } else {
                ctx.log.debug('Passport-Route-Mw: auth ok', { user: user, info: info });
            }
        })(ctx, next);
    }
}

И у меня есть класс API и объявлены маршруты как:

static _setupRoutes(koaApp, koaRouter) {
    koaRouter
        .get('getter', '/getter', koaApp.authAdapter.authroute, MyApi.myGetterMethod);
    koaApp
        .use(koaRouter.routes())
        .use(koaRouter.allowedMethods());
}

... MyApi

static async myGetterMethod(ctx) {
   ...
}

Теперь проблема: setup и setupRoutes вызываются правильно. Проверка паспорта выполняется, также выполняется метод authroute.

Моя проблема в том, что myGetterMethod нет.

Я подозреваю, что при инкапсуляции passport.authenticate «возврат» не выполняется должным образом.

Как это должно быть реализовано? ждать?

ОБНОВЛЕНИЕ: спасибо за ответ ниже, действительно, это было решением, поэтому мой метод закончился так:

async function authenticate(ctx, next) {
    // https://github.com/rkusa/koa-passport/issues/125#issuecomment-462614317

    return passport.authenticate('http-bearer', { session: false }, async(err, user, info) => {
        if (err || !user) {
            ctx.throw(401, 'passport-auth: user unauthenticated');
        }

        await next();
    })(ctx);
};

1 Ответ

0 голосов
/ 22 апреля 2019

Я думаю, вам нужен вызов next при обратном вызове, потому что koa-passport остановит вызов next, когда вы предоставите пользовательский обратный вызов

КоА-паспорт

строка 94: вызов пользовательского обратного вызова всегда будет вызывать resolve(false)

строка 149: if resolve(cont !== false) call next

как результат, использование пользовательского обратного вызова остановит цепочку. вам нужно позвонить next в вашем обратном вызове.

...