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

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

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


当前回答

这个问题是前一段时间提出来的,但人们的想法还在继续。

本草案的第6.5.3节(由Fielding和Reschke编写)赋予状态代码403与RFC 2616中所记录的状态代码略有不同的含义。

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

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

6.5.3.403禁止403(禁止)状态代码表示服务器理解请求但拒绝授权。希望公开请求被禁止的原因的服务器可以在响应有效负载(如果有的话)中描述该原因。如果请求中提供了身份验证凭据,则服务器认为这些凭据不足以授予访问权限。客户端不应使用相同的凭据重复请求。客户端可以使用新的或不同的凭据重复请求。但是,由于与凭据无关的原因,请求可能被禁止。希望“隐藏”当前存在的禁用目标资源的源服务器可能会以状态代码404(未找到)进行响应。

无论您使用什么约定,重要的是在站点/API中提供一致性。

其他回答

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

编辑:RFC2616已过时,请参阅RFC9110。

401未授权:

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

403禁止:

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

从您的用例来看,用户似乎没有经过身份验证。我会返回401。


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

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

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

401:客户端应指定凭据。

指定的凭据格式无效。

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

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

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

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

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

指定的凭据已过期。

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

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

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

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

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

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

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

401响应是指以下之一:

缺少访问令牌。访问令牌已过期、吊销、格式错误或无效。

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

我已经为您创建了一个简单的注释,它将使您明白。