在PassportJS中Prorogate自定义错误

时间:2017-08-19 12:43:52

标签: javascript node.js jwt passport.js

我试图重构我现有的应用程序以增加对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对象(如上面的链接),但这不适用于我现有的应用程序。

有人可以帮助我吗?

1 个答案:

答案 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 })
  }
)