使用koa.js和koa-passport,我可以有条件地应用中间件吗?

我的服务器使用带有内置“会话”身份验证的koa-passport身份验证Web访问者:

app.use( passport.initialize() );
app.use( passport.authenticate( 'session', {} );  // = app.use( passport.session() );


现在,我还需要通过SSL端口将服务器作为API端点进行访问。
API端点不使用会话。通过承载令牌进行身份验证。
Passport-http-bearer为此:

app.use( passport.initialize() );
app.use( passport.authenticate( 'session', {} );
app.use( passport.authenticate( 'bearer', {session:false} ));


当然,这是行不通的,因为“会话”或“承载者”将始终失败,因此没有请求可以通过。

我想到有条件地应用中间件:

if( this.request.headers.authenticate.startsWith( 'Bearer' )){
    app.use( passport.authenticate( 'bearer', {session:false} ));
} else {
    app.use( passport.authenticate( 'session', {} );
}


当然,这是行不通的,因为不是在运行时为每个请求构建堆栈,因此请求标头是未定义的,并且不会编译。

我试过了,除非。从理论上讲,它应该可以工作,但是即使示例代码也会在koa@1.2上引发错误。

因此,目前我已经将条件纳入了“护照-http-持票人”策略;这行得通,但几乎无法支持。

有任何想法吗?谢谢!

最佳答案

不确定是否适用,但您可以通过执行三元操作来做条件中间件

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', {})
)

关于node.js - 使用koa,我可以有条件地应用 Passport 中间件吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37362438/

10-11 09:33
查看更多