使用koa.js和koa-passport,我可以有条件地申请中间件吗?
我的服务器使用带有内置“会话”身份验证的koa-passport对web访问者进行身份验证:
app.use( passport.initialize() );
app.use( passport.authenticate( 'session', {} ); // = app.use( passport.session() ); 现在,我需要访问作为API端点的服务器,也要通过SSL端口。API端点不使用会话;身份验证是通过持有者令牌进行的。Passport-http-bearer执行以下操作:
app.use( passport.initialize() );
app.use( passport.authenticate( 'session', {} );
app.use( passport.authenticate( 'bearer', {session:false} ));当然,这是行不通的,因为'session‘或'bearer’总是会失败,所以没有请求通过。
我考虑有条件地应用中间件:
if( this.request.headers.authenticate.startsWith( 'Bearer' )){
app.use( passport.authenticate( 'bearer', {session:false} ));
} else {
app.use( passport.authenticate( 'session', {} );
}当然,这不起作用,因为堆栈不是在运行时为每个请求构建的,因此请求头是未定义的,因此它不会编译。
我尝试了koa-除非;理论上它应该可以工作,但即使是示例代码也会在koa@1.2上抛出一个错误。
因此,目前我已经将该条件修补到了passport-http-bearer策略中;这是可行的,但它几乎是不可支持的。
有什么想法吗?谢谢!
发布于 2016-05-22 11:48:52
我个人以前没有使用过承载,但是您应该能够使用在您的上下文中可用的isAuthenticated助手方法。
下面是另一个堆栈溢出线程Documentation for "ensureAuthentication" "isAuthenticated" passport's functions?
Koa
exports.isAuthenticated = async (ctx, next) => {
if (ctx.isAuthenticated()) {
await next()
}
if (!ctx.isAuthenticated()) {
ctx.session.returnTo = ctx.request.originalUrl
ctx.redirect('/auth/login')
}
}如果这不起作用,您可以创建一个自定义中间件来处理这两种情况。Passport.js optional authentication
exports.isAuthenticated = async (ctx, next) => {
if (ctx.isAuthenticated() || await passport.authenticate('bearer', {session: 'false'} ) ) {
await next()
}
ctx.session.returnTo = ctx.request.originalUrl
ctx.redirect('/auth/login')
}发布于 2018-02-22 17:43:13
不确定是否适用,但您可以通过像这样做三元来实现条件中间件
koa.use(koa.context.something ? (ctx, next) => next() : passport.initialize())因此,在您的情况下,这应该是可行的
app.use(this.request.headers.authenticate.startsWith('Bearer') ?
passport.authenticate('bearer', {session:false}))
: passport.authenticate('session', {})
)https://stackoverflow.com/questions/37362438
复制相似问题