对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?

401未授权?403禁止?还有别的吗?

到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?


当前回答

丹尼尔·欧文(Daniel Irvine)的明确解释[原始链接]:

401 Unauthorized(401未授权)存在问题,这是身份验证错误的HTTP状态代码。这就是它:它用于身份验证,而不是授权。收到401响应时,服务器会告诉你,“你不是已验证–完全未验证或已验证不正确–但请重新验证并重试。”为了帮助您,它将始终包含一个WWW Authenticate标头,描述如何以进行身份验证。这是通常由web服务器而不是web返回的响应应用这也是非常暂时的;服务器要求您尝试再一次因此,为了获得授权,我使用403 Forbidden响应。它是永久性的,它与我的应用程序逻辑有关,而且更具体响应大于401。收到403响应时,服务器会告诉你:“对不起,我知道你是谁——我相信你说的你是谁,但你只是没有访问此资源的权限。也许如果你问系统管理员很好,你会得到许可的。但请不要打扰直到你的困境改变。”总之,401未经授权的响应应用于缺失或认证错误,应使用403禁止响应之后,当用户经过身份验证但未被授权对给定资源执行请求的操作。

另一种很好的图片格式,说明如何使用http状态代码。

其他回答

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

你陈述了两种不同的情况;每种情况都应有不同的反应:

如果他们根本没有登录,您应该返回401未授权如果他们已登录但不属于正确的用户组,则应返回403禁止

根据收到的对此答案的评论,请注意RFC:

如果用户未登录,他们将被取消身份验证,其HTTP等效值为401,在RFC中被错误地称为“未授权”。如第10.4.2节所述,401未经授权:

“请求需要用户身份验证。”

如果您未经认证,401是正确的响应。然而,如果您未经授权,在语义正确的意义上,403是正确的响应。

!!! DEPR:答案反映了直到2014年以前的普遍做法!!!

TL;博士

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

实际示例

如果apache需要身份验证(通过.htaccess),并且您单击“取消”,则它将响应401“所需授权”

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

RFC(2616第10节)

401未授权(10.4.2)

含义1:需要认证

请求需要用户身份验证。。。

含义2:身份验证不足

…如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。。。

403禁止(10.4.4)

含义:与身份验证无关

…授权没有帮助。。。

更多详情:

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

应说明实体拒绝的原因

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

(如果服务器希望将此信息保留给客户端)

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

以下是在这种逻辑下的一些情况,在这些情况下,验证或授权会返回错误,重要短语用粗体表示。

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

401:客户端应指定凭据。

指定的凭据格式无效。

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

指定的凭据引用的用户不存在。

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

指定的凭据无效,但请指定有效的用户(如果不需要指定的用户,请不要指定用户)。

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

指定的凭据已过期。

401:这实际上与通常的无效凭据相同,因此客户端应该指定有效凭据。

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

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

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

403:这与凭据无关,因此指定有效凭据没有帮助。

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

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

英语:

401

您可能被允许访问,但出于某种原因否认。例如密码错误?请使用正确的请求重试你会得到成功的回应。

403

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

401未经授权:我不知道你是谁。这是一个身份验证错误。403禁止:我知道你是谁,但你没有访问此资源的权限。这是一个授权错误。