使用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/