401似乎用于表示身份验证失败,而403用于授权失败(这意味着身份验证成功了吗?) 如果我尝试使用过期令牌进行身份验证,那么在oauth流的情况下,提示客户端刷新令牌并重试的正确错误代码是什么?
答案 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:
{"active": false}
而没有更多信息,则意味着该令牌无效(过去可能有效,但该信息无效)保持)。 此外,403响应将指示客户端这是授权问题,因此使用新令牌重试的机会不大,而401则将传递令牌未接受的信息,因此也许重新尝试使用新的新令牌可能会起作用。
由于这些原因,我选择在实现中返回401。 TBH无关紧要,因为令牌到期应由客户端根据AS与令牌同时返回的“ expires_in”信息来处理。
答案 2 :(得分:0)
考虑一下机场的登机流程。他们检查了两件事:
他们检查您的身份证。这是身份验证。在网上,任何令牌或用户/密码对都代表您的身份证。
他们会检查您是否在该飞机的乘客列表中(飞机是您尝试访问的资源)。这是授权。在线时,用户尝试访问的页面代表该资源。
因此,现在当您考虑访问问题(令牌过期,令牌解析失败,无效密码,不允许用户)以及应该返回的HTTP代码时,您只需要考虑“如果此问题已转入机场,情况下,我被拒绝上飞机,这与身份证检查步骤有关系吗?”如果是,则为401。如果不是,则为403。
例如:
缺少令牌<=>
缺少身份证<=>
由于身份证<=>
401被拒绝
令牌<=>
已过期身份证<=>
已过期由于身份证支票<=>
401被拒绝
格式错误的令牌<=>
无法读取/损坏的身份证<=>
由于身份证=>
401而被拒绝
用户没有资源<=>
的特权不允许乘客进入此飞机<=>
不允许 ,因为身份证支票=>
403
您禁止用户<=>
乘客被列入黑名单<=>
不 由于身份证检查=>
而被拒绝403
等。