首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用koa,我可以有条件地申请护照中间件吗?

使用koa,我可以有条件地申请护照中间件吗?
EN

Stack Overflow用户
提问于 2016-05-21 19:40:33
回答 2查看 1.8K关注 0票数 1

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

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

代码语言:javascript
复制
app.use( passport.initialize() );
app.use( passport.authenticate( 'session', {} );  // = app.use( passport.session() ); 

现在,我需要访问作为API端点的服务器,也要通过SSL端口。API端点不使用会话;身份验证是通过持有者令牌进行的。Passport-http-bearer执行以下操作:

代码语言:javascript
复制
app.use( passport.initialize() );
app.use( passport.authenticate( 'session', {} );
app.use( passport.authenticate( 'bearer', {session:false} ));

当然,这是行不通的,因为'session‘或'bearer’总是会失败,所以没有请求通过。

我考虑有条件地应用中间件:

代码语言:javascript
复制
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策略中;这是可行的,但它几乎是不可支持的。

有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-05-22 11:48:52

我个人以前没有使用过承载,但是您应该能够使用在您的上下文中可用的isAuthenticated助手方法。

下面是另一个堆栈溢出线程Documentation for "ensureAuthentication" "isAuthenticated" passport's functions?

Koa

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

代码语言:javascript
复制
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')
}
票数 0
EN

Stack Overflow用户

发布于 2018-02-22 17:43:13

不确定是否适用,但您可以通过像这样做三元来实现条件中间件

代码语言:javascript
复制
koa.use(koa.context.something ? (ctx, next) => next() : passport.initialize())

因此,在您的情况下,这应该是可行的

代码语言:javascript
复制
app.use(this.request.headers.authenticate.startsWith('Bearer') ? 
  passport.authenticate('bearer', {session:false})) 
  : passport.authenticate('session', {})
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37362438

复制
相关文章

相似问题

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