Prorogate PassportJS 中的自定义错误
Posted
技术标签:
【中文标题】Prorogate PassportJS 中的自定义错误【英文标题】:Prorogate a custom error in PassportJS 【发布时间】:2018-01-28 00:40:17 【问题描述】:我正在尝试重构我现有的应用程序以添加对 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));
但是我无法处理这个错误,无论我作为 done 回调的第一个参数传递什么,Passport 总是发送 401 - Unauthorized 响应。
这不是我所期望的,因为我的代码库中有许多错误处理程序,我想向客户端传达一个有意义的错误。
到目前为止,我在 Google 上搜索了很多,除了 official documentation 之外,我还打开了几个 SO 问题,但这些解决方案中的任何一个都可以解决我的问题。
例如,这个问题的一个常见解决方案是使用闭包来访问 req 和 res 对象(如上面的链接),但这不适用于我现有的应用程序。
有人可以帮我吗?
【问题讨论】:
【参考方案1】:所以我假设您想帮助用户并说密码不正确。
在“验证回调”部分中,您可以找到以下示例:
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 )
)
【讨论】:
这行得通,但正如我上面所说,我宁愿不要使用闭包,因为 verify 方法在我的应用程序的另一部分中,并且它也被使用通过其他功能,所以我应该重构大量代码以更改它,无论如何它会破坏结构,不要将关注点分开。真的没有其他解决方案了吗? 我也试图破解它调用 .bind(req, res, next) 并通过 this.req、this.res 和 this.next 访问它,但是自从我转换后这是一团糟我在返回中间件的中间件中的函数。不完全是优雅的代码 嘿,这对你有帮助吗:Documentation for failWithError option #458?见代码编辑以上是关于Prorogate PassportJS 中的自定义错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Express & Passportjs 检查 MongoDB 文档中的特定字段