对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
对于存在但用户没有足够权限(他们未登录或不属于正确的用户组)的网页,要提供的正确HTTP响应是什么?
401未授权?403禁止?还有别的吗?
到目前为止,我读到的每一篇文章都不太清楚两者之间的区别。每个响应都适合哪些用例?
当前回答
根据RFC 2616(HTTP/1.1)403在以下情况下发送:
服务器理解该请求,但拒绝履行该请求。授权没有帮助,不应重复该请求。如果请求方法不是HEAD,并且服务器希望公开请求未完成的原因,则应在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码404(未找到)
换句话说,如果客户端可以通过认证访问资源,则应发送401。
其他回答
在401对403的情况下,这已经得到了多次回答。这本质上是一场“HTTP请求环境”辩论,而不是“应用程序”辩论。
您自己的登录问题(应用程序)似乎有问题。
在这种情况下,仅仅不登录不足以发送401或403,除非您使用HTTP Auth与登录页面(与设置HTTP Auth无关)。听起来您可能正在寻找一个“201已创建”,其中有一个滚动您自己的登录屏幕(而不是请求的资源),用于应用程序级访问文件。上面写着:
“我听到了,它在这里,但试试这个(不允许你看到)”
编辑:RFC2616已过时,请参阅RFC9110。
401未授权:
如果请求已经包括授权凭证,则401响应指示已拒绝对这些凭证的授权。
403禁止:
服务器理解该请求,但拒绝履行该请求。
从您的用例来看,用户似乎没有经过身份验证。我会返回401。
401响应是指以下之一:
缺少访问令牌。访问令牌已过期、吊销、格式错误或无效。
403响应另一方面意味着访问令牌确实有效,但用户没有执行所请求的操作的适当权限。
我认为重要的是要考虑到,对于浏览器,401会启动一个验证对话框,让用户输入新的凭据,而403不会。浏览器认为,如果返回401,那么用户应该重新验证。因此401代表无效认证,而403代表缺乏许可。
以下是在这种逻辑下的一些情况,在这些情况下,验证或授权会返回错误,重要短语用粗体表示。
资源需要身份验证,但未指定凭据。
401:客户端应指定凭据。
指定的凭据格式无效。
400:这既不是401也不是403,因为语法错误应该总是返回400。
指定的凭据引用的用户不存在。
401:客户端应指定有效凭据。
指定的凭据无效,但请指定有效的用户(如果不需要指定的用户,请不要指定用户)。
401:同样,客户端应该指定有效的凭据。
指定的凭据已过期。
401:这实际上与通常的无效凭据相同,因此客户端应该指定有效凭据。
指定的凭据完全有效,但不足以满足特定资源的需要,尽管具有更多权限的凭据也可能。
403:指定有效凭据不会授予对资源的访问权限,因为当前凭据已经有效,但只有不具有权限。
无论凭据如何,都无法访问特定资源。
403:这与凭据无关,因此指定有效凭据没有帮助。
指定的凭据完全有效,但特定客户端被阻止使用它们。
403:如果客户端被阻止,指定新凭据将不会有任何作用。
401:您需要HTTP基本身份验证才能看到这一点。
如果用户只需要使用您站点的标准HTML登录表单登录,401将不合适,因为它特定于HTTP基本身份验证。
403:此资源存在,但您无权查看它,HTTP基本身份验证也无济于事。
我不建议使用403来拒绝访问/包含之类的内容,因为就web而言,这些资源根本不存在,因此应该使用404。
换句话说,403表示“此资源需要HTTP基本身份验证以外的某种身份验证(例如使用网站的标准HTML登录表单)”。
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2