我正在使用express创建一个JSON API,并且将Passport与HTTP Bearer策略一起用于身份验证。
我添加了passport.authenticate('bearer', {session: false})
作为中间件。但是,只要会话出现问题,它就会以正文Unauthorized和状态401进行响应。实际信息以挑战的形式出现在WWW-Authenticate
标头中,例如:Bearer realm="Users", error="invalid_token", error_description="invalid token"
当没有身份验证令牌时:Bearer realm="Users"
我想将响应更改为包含错误信息的json。
由于我没有很多为后端编写东西的经验,因此我一直在阅读文档和代码。
Bearer strategy只是调用失败,并带有400
或质询字符串。基本上,我的问题是从这里开始的,因为我不想为这些质询字符串编写解析器,所以为什么不将此信息作为常规变量传递呢?
然后在Passport's authenticate middleware中,根据您的配置,将该挑战传递给回调,req.flash,会话和/或WWW-Authenticate标头。浏览此代码会尝试首先实际检索challenge.type
和challenge.message
。当故障处理未委托给应用程序时,它将检查挑战是否为字符串,如果是,则将其放入WWW-Authenticate标头中。这可能是承载策略以字符串形式返回挑战的原因吗?
因此,以我为例,提供回调以使我可以直接应对这些挑战是否有意义?
但是,仍然,bearer的挑战是需要解析的字符串吗?
人们是否没有将这种承载策略用于JSON API?
最佳答案
passport
中的默认故障响应如下:
https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js#L174
但是,如果提供authenticate
callback
,它将运行以下代码:
https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js#L107
因此,解决方案是为authenticate(passport, name, options, callback)
提供回调参数。然后,您可以截取身份验证失败并根据需要进行响应。
请注意,res
对象实际上并未传递给您的回调。您必须像下面这样包装对authenticate
的调用才能响应:
(req, res, next) => {
passport.authenticate('bearer', { /* options */ }, (err, user, challenges, statuses) => {
if (statuses) {
res
.status(401)
.json({
challenges,
statuses,
})
.end();
} else {
next(); // We are authenticated!
}
})(req, res, next);
}
关于node.js - 如何从Passport策略中获取错误以创建json响应?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41243283/