403 Forbidden vs 401 Unauthorized HTTP响应

Vir*_*dia 2544 http-status-codes http-response-codes http-headers http-status-code-403 http-status-code-401

对于存在的网页,但对于没有足够权限的用户(他们未登录或不属于正确的用户组),要提供的正确HTTP响应是什么?401?403?别的什么?到目前为止,我对每个人的看法都不太清楚.哪些用例适合每个响应?

JPR*_*ddy 3795

Daniel Irvine的清晰解释:

401 Unauthorized存在问题,这是用于身份验证错误的HTTP状态代码.就是这样:它是用于身份验证,而不是授权.收到401响应是服务器告诉您,"您未经过身份验证 - 根本未经过身份验证或未正确验证 - 但请重新进行身份验证并重试."为了帮助您,它将始终包含一个描述的WWW-Authenticate标头如何进行身份验证.

这是您的Web服务器通常返回的响应,而不是您的Web应用程序.

这也是非常暂时的; 服务器要求您再试一次.

因此,对于授权,我使用403 Forbidden响应.它是永久性的,它与我的应用程序逻辑相关联,而且它比401更具体.

收到403响应是服务器告诉你,"对不起.我知道你是谁 - 我相信你说的是谁 - 但你只是没有权限访问这个资源.也许如果您很好地询问系统管理员,您将获得许可.但是,在你的困境发生变化之前,请不要再打扰我了."

总之,401 Unauthorized响应应该用于丢失或错误的身份验证,之后,当用户通过身份验证但无权对给定资源执行请求的操作时,应使用403 Forbidden响应.

关于如何使用http状态代码的另一种很好的图形格式.

  • @JPReddy你的回答是对的.但是,我希望将401命名为"Unauthenticated",将403命名为"Unauthorized".令人非常困惑的是,401与身份验证有关,其格式伴随着文本"未经授权"....除非我不擅长英语(这很可能). (311认同)
  • 401是认证错误,403是授权错误.就那么简单. (81认同)
  • @ZaidMasud,根据RFC这种解释是不正确的.Cumbayah的回答是正确的.401表示"您错过了正确的授权".它意味着"如果你想要你可能会尝试验证自己".因此,未正确验证自身的客户端以及未通过授权的经过适当验证的客户端都将获得401. 403表示"我不会回答此问题,无论您是谁".RFC明确指出,在403的情况下,"授权将无济于事". (62认同)
  • 默认的IIS 403消息是"这是一般403错误,意味着经过身份验证的用户无权查看该页面",这似乎是一致的. (37认同)
  • 你遗漏了"嗯,这是我对它的看法:)"从他的博客文章复制时,不幸的是他的观点是错误的.正如其他人所说,403意味着无论您被认证为谁,都无法访问资源.我通常将此状态代码用于由我不需要直接访问的IP地址范围或我的webroot中的文件锁定的资源(即脚本必须为它们提供服务). (28认同)
  • 对于所有提到RFC(最有可能是2616)的downvoters,你都错了.正如@Idrut在[answer](http://stackoverflow.com/a/14713094/1139533)中所述,"Forbidden意味着客户端已成功通过身份验证,但未经授权." 他引用了RFC7231和RFC7235,**过时了**RFC 2616. (23认同)
  • 我想在这里回答@TomLint**Google员工要小心**:这里的许多评论都是错误的参考RFC-2616,后来被[RFC 7231]废弃了(https://tools.ietf.org/ HTML/rfc7231).答案是对的. (15认同)
  • 尽管我想给这个答案+1,它目前只有403个赞成票,我不想破坏它!:) (14认同)
  • "401未经授权[...]不是授权"似乎绝对矛盾. (10认同)
  • 我同意这种解释是不正确的.创建403是为了拒绝目录访问而不是授权.我知道作为开发人员,403在拒绝授权时"感觉"是正确的,但是,它在RFC中清楚地说明了其他选民所说的内容.请参阅:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html - 无论身份验证凭据更改为什么,返回403的URL都不会允许访问. (10认同)
  • 很抱歉,我没有将其命名为"401 Unauthorized"的协议命名为:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2 (7认同)
  • @DavideR.请相信我你错了.当RFC规定403"授权无效"时,它指的是401授权,这在语义上意味着认证.经过身份验证的客户端永远不会看到401,这正是[RFC](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)定义401:"请求需要用户身份验证". (7认同)
  • 这个答案简直就是**错了**!阅读下面的答案#13和RFC.明确指出,对于身份验证和授权,应使用401 Not Authorized,并在身体中使用不同的信息.在这种情况下,使用401的答案也是错误的,即没有使用HTTP身份验证.在这种情况下,您应该在下面的答案和他们记录良好的来源中选择403或拒绝访问. (5认同)
  • 真正具有讽刺意味的是,丹尼尔·欧文博客文章的原始链接给出了现在的**403**; 即使它仍然列在他的索引中(https://www.danielirvine.com/blog/2011/07/18/)也许他不明白如何/何时使用这些错误代码^^ (4认同)
  • -1丹尼尔·欧文错误地认为这一点,900多名选民也没有仔细阅读RFC.401由于任何原因未经授权:由于凭证丢失或认证失败或因为帐户未被授权访问资源.403是锁定资源 - 例如,对合作伙伴资源的请求,该合作伙伴资源根据客户端ip验证合作伙伴ID(对于已知每个合作伙伴提交的请求来自特定客户端ip的情况) (3认同)
  • 我同意这个答案。401 是“我不知道你是谁”,403 是“我知道你是谁,但你无法访问此文件”。我相信 RFC 支持这一点,但显然还有争论的余地。所以忘记 RFC 所说的吧。不泄露不需要的信息不是安全准则之一吗?也就是说,如果用户提交了错误的密码,您不会回复“好吧,您的用户名是正确的,所以只需尝试暴力破解密码即可”。对锁定的、永远不会被提供服务的文件回复“403”本质上是同一件事。“我永远不会通过 HTTP 提供 sooper-sekrit.htm,尝试 FTP!” (3认同)
  • 我认为403是说“我有资源,但我会忽略您的请求”的一种方式。 (2认同)
  • -1,见Idruts的答案.401仅用于HTTP认证,因为RFC规定必须在响应中发送WWW-Authenticate头. (2认同)
  • @ShahriyarImanov,401 _Unauthorized_是身份验证错误,403 _Forbidden_​​是授权错误.不那么简单:P (2认同)
  • 我阅读的最新RFC:401表示未经身份验证;403可能意味着授权不足(在这种情况下,不同的身份验证可能会有所帮助),或者可能与凭据无关(在这种情况下,添加或更改身份验证将无济于事)。您不应仅凭403来推断您已通过身份验证,但是如果您获得401,则应推断您未通过身份验证。 (2认同)

Ode*_*ded 381

RFC2616:

401未经授权:

如果请求已包含授权凭据,则401响应表示已拒绝授权这些凭据.

403禁止:

服务器理解请求,但拒绝履行请求.

更新

从您的用例中可以看出,用户未经过身份验证.我会回401.


编辑:RFC2616已过时,请参阅RFC7231RFC7235.

  • 我没有投票,但我觉得这个答案很容易让人误解.403 forbidden更适用于永远不会被提供的内容(如asp.net中的.config文件).无论是那个还是404. imho,为了可以访问的东西返回403是不合适的,但是你没有正确的凭据.我的解决方案是提供一条访问被拒绝的消息,其中包含一种更改凭据的方法.那个或401. (52认同)
  • "响应必须包含一个WWW-Authenticate头字段(第14.47节),其中包含适用于所请求资源的质询." 看起来如果您不想使用HTTP样式的身份验证,401响应代码是不合适的. (27认同)
  • 谢谢,这有助于我澄清它.我正在使用两者 - 未经身份验证的用户使用401,对权限不足的经过身份验证的用户使用403. (21认同)
  • 我会在这里支持Billiand.声明是"如果请求已包含授权凭证".这意味着如果这是来自提供凭证的请求的响应(例如来自RFC2617认证尝试的响应).它本质上是允许服务器说"错误的帐户/密码对,再试一次".在提出的问题中,用户可能是经过身份验证但未经授权.对于那些情况,401永远不是适当的回应. (8认同)
  • Brilliand是对的,401仅适用于HTTP身份验证. (6认同)
  • Google员工要注意:这个答案引用了RFC-2616,后来被[RFC 7231](https://tools.ietf.org/html/rfc7231)淘汰了. (4认同)
  • 我认为401 RFC定义只是过时了.它不应该是401未经授权,你需要_somehow_获取一个身份验证令牌,具体取决于服务器接受的内容.*IF*服务器发送WWW-Authenticate,您可以使用它.实际上,即OAuth Bearer令牌不能通过这些方式创建,但它确实是一个需要提交Authentication头的未经身份验证的请求.就个人而言,我发送401用于_any_种未经身份验证的请求,因为我们在一个年龄帖子中认为RFC认为是身份验证.403对于缺少OAuth令牌是明确错误的,400太通用了 (2认同)

ldr*_*rut 287

缺少其他答案的一点是,必须理解RFC 2616上下文中的身份验证和授权仅涉及RFC 2617的HTTP身份验证协议.HTTP状态代码不支持RFC2617以外的方案的身份验证,因此不予考虑在决定是否使用401或403时.

简短而简洁

Unauthorized表示客户端未通过RFC2617身份验证,并且服务器正在启动身份验证过程.Forbidden表示客户端已通过RFC2617身份验证且没有授权,或者表示服务器不支持所请求资源的RFC2617.

这意味着如果您拥有自己的滚动登录过程并且从不使用HTTP身份验证,则403始终是正确的响应,并且永远不应使用401.

详细而深入

来自RFC2616

10.4.2 401未经授权

该请求需要用户身份验证.响应必须包含WWW-Authenticate头字段(第14.47节),其中包含适用于所请求资源的质询.客户端可以使用合适的Authorization头字段重复请求(第14.8节).

10.4.4 403禁止服务器理解请求但拒绝履行请求.授权无效,请求不应重复.

首先要记住的是,本文档上下文中的"身份验证"和"授权"特指RFC 2617中的HTTP身份验证协议.它们不是指您可能创建的任何自己的身份验证协议使用登录页面等.我将使用"登录"来指代RFC2617以外的方法进行身份验证和授权

所以真正的区别不在于问题是什么,甚至是否有解决方案.不同之处在于服务器期望客户端下一步做什么.

401表示无法提供资源,但服务器要求客户端通过HTTP身份验证登录并发送回复标头以启动该过程.可能有允许访问资源的授权,可能没有,但让我们试一试,看看会发生什么.

403表示无法提供资源,对于当前用户来说,没有办法通过RFC2617解决这个问题,也没有办法尝试.这可能是因为已知没有任何级别的身份验证就足够了(例如由于IP黑名单),但可能是因为用户已经过身份验证且没有权限.RFC2617模型是单用户,一个凭证,因此可以忽略用户可能拥有可以授权的第二组凭证的情况.它既不暗示也不暗示某种登录页面或其他非RFC2617认证协议可能有所帮助 - 也可能没有帮助 - 这超出了RFC2616标准和定义.


编辑:RFC2616已过时,请参阅RFC7231RFC7235.

  • 这很重要:"如果你有自己的滚动登录过程并且从不使用HTTP身份验证,则403始终是正确的响应,并且永远不应该使用401." (8认同)
  • 那么当用户请求需要非http身份验证的页面时,我们应该怎么做?发送状态代码403? (7认同)
  • RFC7235不提供"自己动手"或备用auth挑战吗?为什么我的应用程序的登录流程不能以"WWW-Authenticate"标题的形式呈现其挑战?即使浏览器不支持它,我的React应用程序也可以...... (4认同)
  • 这是回答我对这种区别的问题的答案. (2认同)
  • RFC2616 应该被烧毁并由 RFC7235 取代,但据我所知,该主题没有任何变化。 (2认同)
  • RFC 7231(超文本传输​​协议(HTTP/1.1):语义和内容)更改了 403 的含义:不再有“授权无济于事”。它说:“如果请求中提供了身份验证凭据,服务器认为它们不足以授予访问权限。客户端不应使用相同的凭据自动重复请求。客户端可以使用新的或不同的凭据重复请求。” 因此,授权(授予更多权限)**将**有所帮助,并且这个答案现在不正确(以前是正确的)。 (2认同)

Chr*_*ssy 117

   Resource exists ? (if private it is often checked AFTER auth check)
    |       |
 NO |       | YES
    v       v
   404      Is logged-in ? (authenticated, aka has session)
   or         |              |
   401     NO |              | YES
   403        |              |
              v              v
              401            Can access resource ? (permission, authorized) ?
         (404 no reveal)      |            |
             or 301        NO |            | YES
             redirect         |            |
             to login         v            v
                              403          OK 200, 301, ...
                      (or 404: no reveal)

检查通常按以下顺序进行:

  • 401如果没有登录或会话已过期
  • 403如果用户没有访问资源的权限
  • 404如果资源不存在

UNAUTHORIZED:状态代码(401),表示请求需要身份验证,通常这意味着用户需要登录(会话).用户/代理未知的服务器.可以重复其他凭据.注意:这很令人困惑,因为它应该被命名为"未经身份验证"而不是"未经授权".如果会话过期,这也可能在登录后失败.特例:可以代替404使用,以避免泄露资源的存在或不存在(信用@gingerCodeNinja)

FORBIDDEN:状态代码(403),表示服务器理解请求但拒绝履行请求.用户/代理服务器已知但凭据不足.除非凭据更改,否则重复请求将不起作用,这在短时间内不太可能发生.特例:可以代替404使用,以避免泄露资源的存在或不存在(信用@gingerCodeNinja)

NOT FOUND:状态代码(404),表示请求的资源不可用.用户/代理已知,但服务器不会透露有关资源的任何信息,就好像它不存在一样.重复不起作用.这是404的特殊用法(github就是这样做的).

  • 简洁明了的解释。正是我所需要的。 (2认同)

Cum*_*yah 109

根据RFC 2616(HTTP/1.1)403在以下情况下发送:

服务器理解请求,但拒绝履行请求.授权无效,请求不应重复.如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因.如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)

换句话说,如果客户端通过身份验证可以访问资源,则应该发送401.

  • imho,这是最准确的答案.它取决于应用程序,但通常,如果经过身份验证的用户对资源没有足够的权限,您可能希望提供更改凭据或发送401的方法.我认为403最适合从未提供的内容.在asp.net中,这意味着web.config文件*.resx文件等,因为无论哪个用户登录,这些文件都不会被提供,所以没有必要再次尝试. (26认同)
  • @Mel我认为客户端不应该访问的文件应该是404.它是系统内部的文件; 外面甚至不知道它存在.通过返回403,您将让客户知道它存在,无需将该信息提供给黑客.403的规范说:"希望"隐藏"当前存在的禁止目标资源的原始服务器可能会以状态代码404(未找到)进行响应." (11认同)
  • +1,但不确定+1.合乎逻辑的结论是永远不应该返回403,因为401或404将是严格更好的响应. (6认同)
  • 如果不清楚他们是否可以访问?假设我有3个用户级别 - 公共,成员和高级会员.假设该页面仅适用于高级会员.公共用户基本上是未经身份验证的,并且*可以在他们登录时位于会员或高级会员中.对于会员用户级别,403似乎是合适的.对于高级会员,401.但是,您为公众服务的是什么? (4认同)
  • 虽然在我看来这似乎是对旧RFC 2616的准确解释,但请注意RFC 7231 [以不同方式定义403的语义](https://tools.ietf.org/html/rfc7231#section-6.5.3 ),并且实际上明确指出*“客户可以使用新的或不同的凭据重复该请求。” *因此,尽管该答案在2010年是正确的,但今天却完全错误,因为状态代码的含义已在我们的下面重写脚。(令人讨厌的是,[RFC 2616的更改](https://tools.ietf.org/html/rfc7231#appendix-B)附录未确认该更改!) (2认同)

Erw*_*and 44

如果作为另一个用户进行身份验证将授予对所请求资源的访问权限,则应返回401 Unauthorized.403 Forbidden主要用于禁止每个人访问资源或仅限于给定网络或只允许通过SSL访问资源,只要它与身份验证无关.

来自RFC 7235(超文本传输​​协议(HTTP/1.1):身份验证):

3.1.401未经授权

401(未授权)状态代码表示尚未应用请求,因为它缺少目标资源的有效身份验证凭据.源服务器必须发送WWW-Authenticate头字段(第4.4节),其中包含至少一个适用于目标资源的质询. 如果请求包含身份验证凭据,则401响应表示已拒绝授权这些凭据.客户端可以使用新的或替换的Authorization头字段重复请求(第4.1节).如果401响应包含与先前响应相同的挑战,并且用户代理已经尝试过至少一次认证,那么用户代理应该将所包含的表示呈现给用户,因为它通常包含相关的诊断信息.

这是来自RFC 2616:

10.4.4 403禁止

服务器理解请求,但拒绝履行请求.
授权无效,请求不应重复.
如果请求方法不是HEAD并且服务器希望
公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因.如果服务器不希望将此信息提供给客户端,
则可以使用状态代码404 (未找到).

编辑:RFC 7231(超文本传输​​协议(HTTP/1.1):语义和内容)更改403的含义:

6.5.3.403禁止

403(禁止)状态代码表示服务器理解请求但拒绝授权.希望公开请求被禁止的服务器可以在响应有效负载中描述该原因(如果有的话).

如果请求中提供了身份验证凭据,则
服务器认为它们不足以授予访问权限.客户端
不应该使用相同的
凭据自动重复请求.客户端可以使用新的或不同的凭据重复请求.但是,出于
与凭证无关的原因,可能会禁止请求.

希望"隐藏"
禁止目标资源的当前存在的源服务器可以以状态代码
404(未找到)来响应.

因此,403现在可能意味着什么.提供新凭据可能会有所帮助......或者可能没有.

  • 这是有趣的.基于RFC 7231和RFC 7235,我没有看到401和403之间的明显区别 (2认同)
  • 403表示"我认识你,但你看不到这个资源." 没有理由混淆. (2认同)
  • @Brian主要区别在于,如果您的系统使用 RFC 7235 中指定的 HTTP 身份验证,则返回 401(因此您必须返回具有此类响应的 WWW-Authenticate 标头),否则返回 403。 (2认同)
  • @MichaelBlackburn 不,事实并非如此。服务器不需要知道您返回 403。一方面,旧的 RFC 2616 规范和新的 RFC 7231 规范都没有说过这一点;另一方面,新规范中的短语“**如果**在请求中提供了身份验证凭据”*只有在某些情况下可以返回 403 且请求中不包含身份验证凭据时才有意义(即服务器绝对不“认识您”的情况)。 (2认同)

Pat*_*ite 26

这是一个较老的问题,但从未真正提出的一个选项是返回404.从安全角度来看,最高投票的答案会受到潜在的信息泄漏漏洞的影响.例如,假设所讨论的安全网页是系统管理页面,或者更常见的是,是用户无权访问的系统中的记录.理想情况下,您不希望恶意用户甚至不知道那里有页面/记录,更不用说他们没有访问权限了.当我构建这样的东西时,我会尝试在内部日志中记录未经验证/未经授权的请求,但返回404.

OWASP提供了有关攻击者如何将此类信息用作攻击的一部分的更多信息.

  • 在先前的答案中已经提到了404的使用.您的重点是:信息泄漏,对于任何推出自己的身份验证/授权方案的人来说,这应该是一个重要的考虑因素.+1提及OWASP. (3认同)
  • 讽刺的是,OWASP 链接现在转到 404 页面。我在 https://www.owasp.org/index.php/OWASP_Periodic_Table_of_Vulnerability__-_Information_Leakage 上发现了类似的内容(我认为) (2认同)

Dav*_*tts 21

这个问题前一段时间被问过,但人们的想法还在继续.

本草案的6.5.3节(由Fielding和Reschke撰写)给出了状态代码403与RFC 2616中记录的含义略有不同的含义.

它反映了许多流行的Web服务器和框架所采用的身份验证和授权方案中发生的情况.

我强调了我认为最突出的一点.

6.5.3.403禁止

403(禁止)状态代码表示服务器理解请求但拒绝授权.希望公开请求被禁止的服务器可以在响应有效负载中描述该原因(如果有的话).

如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限. 客户端不应该使用相同的凭据重复请求.客户端可以使用新的或不同的凭据重复请求. 但是,出于与凭证无关的原因,可能会禁止请求.

希望"隐藏"禁止目标资源的当前存在的源服务器可以以状态代码404(未找到)来响应.

无论您使用哪种惯例,重要的是在您的网站/ API中提供一致性.

  • 该草案已获得批准,现在为RFC 7231。 (2认同)

小智 14

我为您创建了一个简单的注释,可以清楚地说明这一点。

在此输入图像描述


Lev*_*ite 11

TL; DR

  • 401:拒绝与身份验证有关
  • 403:与认证无关的拒绝

实际例子

如果apache 需要身份验证(通过.htaccess),并且你点击Cancel,它将响应一个401 Authorization Required

如果nginx找到一个文件,但没有访问权限(用户/组)来读取/访问它,它将响应403 Forbidden

RFC(2616第10节)

401未经授权(10.4.2)

含义1:需要进行身份验证

该请求需要用户身份验证....

含义2:认证不足

...如果请求已包含授权凭据,则401响应表示已拒绝授权这些凭据....

403禁止(10.4.4)

含义:与身份验证无关

......授权无济于事......

更多细节:

  • 服务器理解请求,但拒绝履行请求.

  • 它应该描述实体拒绝的原因

  • 可以使用状态代码404(未找到)

    (如果服务器想要从客户端保留此信息)


Zai*_*sud 9

他们没有登录或不属于正确的用户组

你说过两种不同的情况; 每个案例应该有不同的回应:

  1. 如果他们根本没有登录,您应该返回401 Unauthorized
  2. 如果他们已登录但不属于正确的用户组,则应返回403 Forbidden

根据收到的回复评论RFC:

如果用户未登录,则他们未经过身份验证,其HTTP等效值为401,并且在RFC中误导性地称为"未授权".正如第10.4.2节规定的401 Unauthorized:

"该请求需要用户身份验证."

如果您未经身份验证,则401是正确的答案.但是,如果您未经授权,从语义上讲,403是正确的响应.

  • @DavideR.RFC可互换地使用*authentication*和*authorization*.我认为使用*authentication*含义读取时更有意义. (7认同)
  • 这是不正确的.请参阅[RFC](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2)和@ Cumbayah的回答. (5认同)
  • 2616应该烧掉。一些较新的 RFC 更加明确,需要区分“我不认识你”和“我认识你但你无法访问它”。*没有*合法的理由承认永远不会实现(或无法通过http实现)的资源的存在,这就是403-truthers所暗示的。 (2认同)

eme*_*ery 9

401:你又是谁??(程序员走进一家没有身份证或无效身份证的酒吧)

403:哦太棒了,又是你。我已经注视着你了。走吧,离开这里。 (程序员走进他们 86 岁的酒吧)


小智 8

401: I don't know who you are. This an authentication error. 403: I know who you are. But you don't have permission to access this resource. This is an authorization error.

  • @Jasmine你的担忧是可以理解的,但上面的解释是正确的。术语冲突是由于 http 规范不符合当前广泛使用的术语“身份验证”和“授权”的定义而引起的。可能是由于这些定义没有像现在这样普遍使用造成的。我们陷入了冲突及其造成的混乱之中。支持这一点的证据是浏览器的默认行为是在 401 响应上提示输入凭据。 (3认同)

Luc*_* C. 8

这些是含义:

401:用户未(正确)通过身份验证,资源/页面需要身份验证

403 : 用户的角色或权限不允许访问请求的资源,例如用户不是管理员,请求的页面是管理员的。

注意:从技术上讲,403 是 401 的超集,因为为未经身份验证的用户提供 403 也是合法的。无论如何区分更有意义。


Jam*_*mes 7

用英语:

401

您可能被允许访问,但出于某种原因,您被拒绝了此请求。比如密码错误?再试一次,使用正确的请求,您将获得成功响应。

403

你永远不被允许。你的名字不在名单上,你永远不会进入,离开,不要发送重试请求,它总是会被拒绝。离开。


Ran*_*ner 7

401响应代码意味着以下之一:

  1. 缺少访问令牌。
  2. 访问令牌已过期、已撤销、格式错误或无效。

403另一方面,响应代码意味着访问令牌确实有效,但用户没有适当的权限来执行请求的操作。


Vla*_*nea 5

这在我的脑海中比这里的任何地方都简单,所以:

401:您需要 HTTP 基本身份验证才能看到这一点。

403:您看不到这一点,HTTP 基本身份验证也无济于事。

如果用户只需要使用您站点的标准 HTML 登录表单登录,则 401 将不合适,因为它特定于 HTTP 基本身份验证。

我不建议使用 403 来拒绝访问诸如 之类的东西/includes,因为就网络而言,这些资源根本不存在,因此应该使用 404。

这将 403 保留为“您需要登录”。

换句话说,403 表示“此资源需要某种形式的身份验证,而不是 HTTP 基本身份验证”。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2


Gra*_*zan 5

我认为重要的是要考虑到,对于浏览器来说,401 会启动一个身份验证对话框,让用户输入新的凭据,而 403 则不会。浏览器认为,如果返回 401,则用户应该重新进行身份验证。因此,401 代表无效身份验证,而 403 代表缺乏权限。

以下是该逻辑下的一些情况,其中身份验证或授权会返回错误,其中重要短语以粗体显示。

  • 资源需要身份验证,但未指定凭据

401:客户端应指定凭证。

  • 指定的凭据格式无效

400:这既不是 401 也不是 403,因为语法错误应该始终返回 400。

  • 指定的凭据引用了不存在用户

401:客户端应指定有效的凭据。

  • 指定的凭据无效但指定了有效的用户(或者如果不需要指定的用户,则不指定用户)。

401:同样,客户端应该指定有效的凭据。

  • 指定的凭据过期

401:这实际上与一般情况下具有无效凭据相同,因此客户端应指定有效凭据。

  • 指定的凭据完全有效,但不足以满足特定资源的需要,尽管具有更多权限的凭据可能可以满足要求。

403:指定有效的凭据不会授予对资源的访问权限,因为当前凭据已经有效,但只是没有权限。

  • 特定资源无法访问无论凭据如何,都

403:这与凭据无关,因此指定有效凭据无济于事。

  • 指定的凭据完全有效,但特定客户端阻止使用它们。

403:如果客户端被阻止,指定新凭据将不会执行任何操作。


归档时间:

查看次数:

966938 次

最近记录:

6 年 前