更正身份验证令牌到期的HTTP代码 - 401或403?

时间:2017-07-17 21:14:46

标签: http-authentication

401似乎用于表示身份验证失败,而403用于授权失败(这意味着身份验证成功了吗?) 如果我尝试使用过期令牌进行身份验证,那么在oauth流的情况下,提示客户端刷新令牌并重试的正确错误代码是什么?

3 个答案:

答案 0 :(得分:3)

A 401.401 vs 403混淆不是新的。请参阅w3.org电子邮件中的一些讨论:https://lists.w3.org/Archives/Public/ietf-http-wg/2008AprJun/0418.html,尽管引用的RFC 2616已经过时。

Re 401,见https://tools.ietf.org/html/rfc7235#section-3.1

Re 403,见https://tools.ietf.org/html/rfc7231#section-6.5.3

从401描述中,虽然“有效”可用于解释:

  

401(未授权)状态代码表示请求没有      已应用,因为它缺少有效身份验证凭据      目标资源。

但更为相关,请参阅有关承载令牌认证的RFC 6750,第3节,最后一段。 https://tools.ietf.org/html/rfc6750#section-3

  

并且响应受保护的资源请求      使用过期访问令牌的身份验证尝试:

 HTTP/1.1 401 Unauthorized
 WWW-Authenticate: Bearer realm="example",
                   error="invalid_token",
                   error_description="The access token expired"

答案 1 :(得分:0)

除了crunk1答案:

401表示令牌丢失或无效。换句话说,由于某种原因,它未能通过验证或解析。

403表示令牌已成功验证/解析,但随后由于某种原因而拒绝执行该操作的授权。

现在,过期的令牌意味着已成功解析该令牌,但该令牌中设置的过期日期已过。 在某些情况下,资源服务器(接收并验证令牌的API)甚至无法得知,而是返回401:

  • 如果资源服务器使用其Authorization Server自省端点,并且该资源服务器仅返回{"active": false}而没有更多信息,则意味着该令牌无效(过去可能有效,但该信息无效)保持)。
  • 如果资源服务器尝试验证令牌签名,但是令牌太旧且已过期,以至于验证密钥自发布以来已被更新。在那种情况下,即使令牌在技术上已过期,RS也没有理由相信它,而应将其视为无效

此外,403响应将指示客户端这是授权问题,因此使用新令牌重试的机会不大,而401则将传递令牌未接受的信息,因此也许重新尝试使用新的新令牌可能会起作用。

由于这些原因,我选择在实现中返回401。 TBH无关紧要,因为令牌到期应由客户端根据AS与令牌同时返回的“ expires_in”信息来处理。

答案 2 :(得分:0)

考虑一下机场的登机流程。他们检查了两件事:

  1. 他们检查您的身份证。这是身份验证。在网上,任何令牌或用户/密码对都代表您的身份证。

  2. 他们会检查您是否在该飞机的乘客列表中(飞机是您尝试访问的资源)。这是授权。在线时,用户尝试访问的页面代表该资源。

因此,现在当您考虑访问问题(令牌过期,令牌解析失败,无效密码,不允许用户)以及应该返回的HTTP代码时,您只需要考虑“如果此问题已转入机场,情况下,我被拒绝上飞机,这与身份证检查步骤有关系吗?”如果是,则为401。如果不是,则为403。

例如:

  • 缺少令牌<=>缺少身份证<=>由于身份证<=> 401被拒绝

  • 令牌<=>已过期身份证<=>已过期由于身份证支票<=> 401被拒绝

  • 格式错误的令牌<=>无法读取/损坏的身份证<=>由于身份证=> 401而被拒绝

  • 用户没有资源<=>的特权不允许乘客进入此飞机<=> 不允许 ,因为身份证支票=> 403

  • 您禁止用户<=>乘客被列入黑名单<=> 由于身份证检查=>而被拒绝403

  • 等。