【问题标题】:How to get errors from Passport strategy to create json response?如何从 Passport 策略中获取错误以创建 json 响应?
【发布时间】:2016-12-20 13:17:34
【问题描述】:

我正在使用 express 创建一个 JSON API,并且我正在使用带有 HTTP Bearer 策略的 Passport 进行身份验证。

我已将 passport.authenticate('bearer', {session: false}) 添加为中间件。但是,每当会话出现问题时,它只会以未授权主体和状态 401 进行响应。实际信息在 WWW-Authenticate 标头中,以挑战的形式出现,例如: Bearer realm="Users", error="invalid_token", error_description="invalid token" 当没有给出身份验证令牌时: Bearer realm="Users"

我想将响应更改为包含错误信息的 json。

由于我没有太多为后端编写东西的经验,因此我一直在阅读文档和代码。 Bearer strategy 只是调用失败,400 或挑战字符串。基本上这是我的问题开始的地方,因为我不想为这些挑战字符串编写解析器,为什么不将这些信息作为常规变量传递?

Passport's authenticate middleware 中,根据您的配置,此挑战将传递给回调、req.flash、会话和/或 WWW-Authenticate 标头。查看这段代码,它首先尝试实际检索challenge.typechallenge.message。当故障处理未委托给应用程序时,它会检查挑战是否是字符串,如果是,则将它们放入 WWW-Authenticate 标头中。这可能是承载策略将挑战作为字符串返回的原因? 所以也许就我而言,提供回调是有意义的,这样我就可以直接访问这些挑战? 但是,不记名的挑战仍然是需要解析的字符串? 人们没有对 JSON API 使用这种承载策略吗?

【问题讨论】:

    标签: node.js authentication express bearer-token passport.js


    【解决方案1】:

    passport 中的默认失败响应在这里:

    https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js#L174

    但是,如果您提供 authenticate callback 它将运行此代码:

    https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js#L107

    所以解决方案是为authenticate(passport, name, options, callback) 提供一个回调参数。然后您可以拦截身份验证失败并根据需要进行响应。

    请注意,res 对象实际上并未传递给您的回调。您必须将您的电话转至authenticate 才能回复:

    (req, res, next) => {
      passport.authenticate('bearer', { /* options */ }, (err, user, challenges, statuses) => {
        if (statuses) {
          res
            .status(401)
            .json({
              challenges,
              statuses,
            })
            .end();
        } else {
           next(); // We are authenticated!
        }
      })(req, res, next);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 2022-08-16
      • 2019-01-18
      • 2020-01-31
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多