【问题标题】:what should be HTTP status code for credentials Expired error/exception?凭据过期错误/异常的 HTTP 状态代码应该是什么?
【发布时间】:2015-07-16 16:35:49
【问题描述】:

我正在开发 RESTful API,我已经实现了基于令牌的身份验证,其中令牌摘要是使用时间戳准备的。现在,当请求到达 API 服务器时,我正在检查提供的时间戳是否无效(即指定了未来/过去的日期时间),然后抛出错误消息,指示“检测到未来令牌”或“令牌已过期”。我需要附加 HTTP 状态码 我对哪种状态码适合这种情况感到困惑?

到目前为止,我已经查看了可用的状态代码(ref1ref2),我认为在这里使用 400 'bad request' 代替 401 'Unauthorized' 和 403 'forbidden' 状态代码是合适的。

你们觉得呢?

【问题讨论】:

  • 对我来说401稍微适合这里
  • 不是 401 意味着凭据有效但无权访问资源(例如,普通用户尝试访问特定于管理员的 API)
  • 已阅读您的 ref1/ref2。 403 让我对你的 api 的潜在消费者感到困惑。据它说:“授权将无济于事,不应重复请求。”。所以我重新授权不应该帮助我。而 400 只是涵盖细节的一般错误。比你必须添加特定的消息/标题,这不是最好的选择
  • 是的,我在此处发布问题之前确实阅读了它们,关于上述场景的 401/403 的不确定性导致我使用 400 个错误请求,我不确定这仍然是最佳选择,所以是的,我正在寻找了解哪些代码更适合此处以及如何使用
  • 最后由你决定。 :) 在所有情况下,我们都使用 401 作为我们(再次)想要接收凭据的信号。

标签: rest http-status-codes


【解决方案1】:

由于时间戳无效,我认为令牌无效。因此客户端不再经过身份验证。所以我会抛出一个 401 Unauthorized 。您可以随意添加上下文的额外数据作为带有 X- 前缀的 HTTP 标头,或者添加根据 Accept 请求标头(json、文本等)编码的响应正文。喜欢:

{
  "error": {
    "status": 401,
    "details": {
      "code": "401.3",
      "description": "The timestamp provided must not be in the future."
    }
  }
}

这不是 403 Forbidden :403 表示“客户端已通过身份验证,但无权发送此请求”。在您的情况下,我认为客户端不再经过身份验证。

【讨论】:

    【解决方案2】:

    解决方法...考虑过期密码(不完全过期的凭据) 我从https://developer.mozilla.org/en-US/docs/Web/HTTP/Status 找到了这个 403 禁止 客户无权访问内容;也就是说,它是未经授权的, 所以服务器拒绝提供所请求的资源。 与 401 不同,客户端的身份为服务器所知。 //- - - - 好吧,我认为更好的是响应带有描述或自定义内容标头的 403,因此客户端需要使用您的 auth + 参数和新密码调用端点。

    现在,关于过期的凭证(但考虑用户和密码,而不是令牌),403 我也认为不错,因为“服务器知道客户端的身份”但未经授权。

    关于令牌和您的时间戳,我认为带有描述的 401 很好,因为第一步是服务器查看时间戳,在检查任何凭据之前时间戳将失败..

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 2019-05-27
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多