【问题标题】:Prorogate a custom error in PassportJSProrogate 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 对象(如上面的链接),但这不适用于我现有的应用程序。

有人可以帮我吗?

【问题讨论】:

    标签: javascript node.js jwt passport.js


    【解决方案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?见代码编辑
    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多