我试图重构我现有的应用程序以增加对PassportJS的支持,但它比预期的要困难得多。
我使用 passport-jwt 作为策略。所以我有
passport.use(new JwtStrategy(options, user.verify));
router.post(
'/login/jwt',
passport.authenticate('jwt', {session: false, failWithError: true})
);
如果 user.verify 失败则调用(例如)
done(new Error(errors.BAD_REQUEST));
但我无法处理此错误,无论我作为完成回调的第一个参数传递,Passport始终发送 401 - 未经授权的响应。
这不是我所期望的,因为我的代码库中有很多错误处理程序,我想向客户端传达一个有意义的错误。
到目前为止我搜索了很多内容,除了official documentation之外我还打开了几个SO问题,但这些解决方案中的任何一个都解决了我的问题。
例如,此问题的常见解决方案是使用闭包来访问req和res对象(如上面的链接),但这不适用于我现有的应用程序。
有人可以帮助我吗?
答案 0 :(得分:2)
所以我假设你想帮助用户并说密码不正确,例如。
在验证回拨中'你可以找到这个例子的部分:
return done(null, false, { message: 'Incorrect password.' });
默认情况下,如果身份验证失败,Passport将以401 Unauthorized状态响应
要捕获此消息,您可以尝试这样的事情: http://passportjs.org/docs#custom-callback
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
这有帮助吗?
编辑:没有IIFE
app.post('/login',
passport.authenticate('local', { failWithError: true }),
function(req, res, next) {
// Handle success
return res.send({ success: true, message: 'Logged in' })
},
function(err, req, res, next) {
// Handle error
return res.status(401).send({ success: false, message: err })
}
)