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 中的自定义错误的主要内容,如果未能解决你的问题,请参考以下文章

PassportJS - GET 请求中的登录凭据?

PassportJS 中的会话如何协同工作

如何使用 Express & Passportjs 检查 MongoDB 文档中的特定字段

如何从 passportjs 中的刷新令牌中获取新的 Google oauth 访问令牌

从passportjs中的刷新令牌获取oauth访问令牌

Express 会话与 PassportJS 会话