如何封装Koa-Passport?
How to encapsulate Koa-Passport?
也许这有一个非常简单的答案,但我的代码有问题。这是我想做的。
我使用 koa-passport 创建了一个 koa2 应用程序,我想将 Passport 的用法封装在一个 class 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 class 并声明如下路线:
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。正在执行 Passport 验证,同时正在执行 authroute 方法。
我的问题是 myGetterMethod 不是。
我怀疑通过封装 passport.authenticate,"return" 不是它应该的 运行。
应该如何实施?等待?
更新:感谢下面的回答,这确实是解决方案,所以我的方法最终是这样的:
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);
};
我认为你需要在回调中调用 next
,因为当你提供自定义回调时 koa-passport 将停止调用 next
第 94 行:调用自定义回调将始终调用 resolve(false)
第 149 行:if resolve(cont !== false) call next
因此,使用自定义回调将停止链。您需要在回调中调用 next
。
也许这有一个非常简单的答案,但我的代码有问题。这是我想做的。
我使用 koa-passport 创建了一个 koa2 应用程序,我想将 Passport 的用法封装在一个 class 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 class 并声明如下路线:
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。正在执行 Passport 验证,同时正在执行 authroute 方法。
我的问题是 myGetterMethod 不是。
我怀疑通过封装 passport.authenticate,"return" 不是它应该的 运行。
应该如何实施?等待?
更新:感谢下面的回答,这确实是解决方案,所以我的方法最终是这样的:
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);
};
我认为你需要在回调中调用 next
,因为当你提供自定义回调时 koa-passport 将停止调用 next
第 94 行:调用自定义回调将始终调用 resolve(false)
第 149 行:if resolve(cont !== false) call next
因此,使用自定义回调将停止链。您需要在回调中调用 next
。