经过大量的Google搜索和Stackoverflowing后,我仍然不清楚,因为很多文章和问题/答案都过于笼统(包括403 Forbidden vs 401 Unauthorized HTTP responses并非专门针对我的用例)。
问题:当用户未登录并要求查看仅应向登录用户显示的某些页面时,正确的HTTP状态代码是什么?
答案 0 :(得分:13)
我发现的完全令人满意的一次性答案是:
简短回答:
说明
虽然我们首先知道的是身份验证(用户 已登录 吗?)然后我们将进入授权(他是否拥有所需的 特权 ?),但这是导致我们失误的关键:
但是不是“401 Unauthorized”关于授权,而不是认证?
当写入HTTP规范(RFC 2616)时,这两个字可能不会 人们普遍认为它是截然不同的。从中可以清楚地看出来 401的描述和其他支持文本 认证
所以,也许,如果我们想重写标准!关注每个单词,我们可以参考下表:
Status Code | Old foggy naming | New clear naming | Use case
+++++++++++ | ++++++++++++++++ | ++++++++++++++++ | ++++++++++++++++++++++++++++++++++
401 | Unauthorized | Unauthenticated | User has not logged-in
403 | Forbidden | Unauthorized | User doesn't have enough privilege
答案 1 :(得分:3)
这取决于您用于执行登录的机制。
403 Forbidden的规范说:
403(Forbidden)状态代码表示服务器 了解该请求但拒绝授权。一个服务器 希望公开为什么禁止请求可以 在响应有效载荷中描述该原因(如果有的话)。
如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限。客户端 不应该自动重复请求 证书。 客户端可以使用新的或不同的方式重复请求 凭证。但是,出于原因可能会禁止请求 与证书无关。
虽然主要的HTTP状态代码规范中未定义401 Unauthorized,但the HTTP Authentication spec位于{{3}}并说:
401(未授权)状态代码表示请求没有 已被应用,因为它缺乏有效的身份验证凭据 目标资源。 生成401响应的服务器必须发送 包含至少一个的WWW-Authenticate标题字段(第4.1节) 适用于目标资源的挑战。
因此,如果您使用WWW-Authenticate
和Authorization
标头作为身份验证机制,请使用401.如果您使用任何其他方法,请使用403。
答案 2 :(得分:0)
IMO这取决于您要查询的资源类型。这样听起来更合乎逻辑。 “禁止”是指网站的文件或文件夹或一般资源,而如果需要某种类型的执行,页面脚本等,则“未经授权”更合逻辑。