首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何封装Koa?

如何封装Koa?
EN

Stack Overflow用户
提问于 2019-01-14 22:45:54
回答 1查看 319关注 0票数 0

也许这有一个非常简单的答案,但我的代码出现了问题。这是我想做的。

我使用考拉护照创建了一个koa2应用程序,我想将Passport的使用封装在一个AuthAdapter类中(以下简称)。

代码语言:javascript
复制
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类,并声明了如下路线:

代码语言:javascript
复制
static _setupRoutes(koaApp, koaRouter) {
    koaRouter
        .get('getter', '/getter', koaApp.authAdapter.authroute, MyApi.myGetterMethod);
    koaApp
        .use(koaRouter.routes())
        .use(koaRouter.allowedMethods());
}

..。MyApi

代码语言:javascript
复制
static async myGetterMethod(ctx) {
   ...
}

现在的问题是:正确地调用了安装程序和setupRoutes。护照验证正在执行中,并且authroute方法也在执行。

我的问题是,myGetterMethod不是。

我怀疑,通过封装passport.authenticate,“返回”没有按应有的方式运行。

应如何落实这一点?等着呢?

更新:谢谢下面的答案,这确实是解决方案,所以我的方法最终是这样的:

代码语言:javascript
复制
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);
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-22 17:07:11

我认为您需要在回调中调用next,因为当您提供自定义回调时,koa护照将停止呼叫next

koa-护照

第94行:调用自定义回调将始终调用resolve(false)

第149行:if resolve(cont !== false) call next

因此,使用自定义回调将停止链。您需要在回拨中调用next

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54190323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档