资源因权限问题不可访问时,正确的HTTP状态码是什么?

20
我正在为我的计算机科学论文构建一个动态拼车应用的RESTful协议。
在该协议中,我还必须正式指定每个操作的HTTP状态码。我有一个“隐私相关”的问题。假设以下情况:
GET /api/persons/angela/location
检索用户“angela”的当前位置。显然,并非每个人都能够获得结果。只有angela本身和可能要接她的司机才能知道。
我无法决定在此处返回404 Not Found还是401 Forbidden。
有什么提示吗?哪一个是最好的,并为什么?

这里完全错误地返回了404,因为它表示记录根本不存在。 - You
6个回答

41
根据Wikipedia(以及RFC 2616),当页面存在但需要身份验证时,使用401代码;403用于需要身份验证但不会更改任何内容的页面。(在实际应用中,403通常意味着某些内容的权限设置有误,而401将提示用户输入用户名/密码)。404适用于文档不存在的情况。
在您的情况下,似乎401是最合适的代码,因为有一种方式可以对有权访问该页面的用户进行身份验证。

不错!相当多的协议操作需要身份验证。我遇到过这样的情况,即资源可用但由于用户权限而无法检索,以及资源不可用,因为它们之前已被删除。这两种情况都是在经过身份验证的操作下进行的。你会选择在第一种情况下使用401,在第二种情况下使用404吗?因此: 资源存在但无法访问-> 401 资源不存在-> 404 - user237076
如果一个资源被删除了,那么如果随后尝试访问它,返回404是合适的。 - Phil
1
不错的回答,但我更喜欢用“根据维基百科”的说法,而不是“根据RFC 2616”http://tools.ietf.org/html/rfc2616#section-10.4.2 ;) - Day
但是,返回401响应会暴露文件实际存在的事实。 - Jithin Jose
不正确,你引用的RFC解释了如果拒绝访问的原因没有给出,可以使用404错误。(如果用户已经登录,则不会出现401错误,而是403错误,在这种情况下,如果响应中没有解释错误原因,则可能使用404)。例如,Microsoft在访问需要登录的资源时返回401错误。如果登录成功,但用户没有权限,则根据上下文可能显示404错误。https://www.rfc-editor.org/rfc/rfc2616#section-10.4.4 - ArthNRick

7
如果请求中提供了授权凭证,但请求者没有权限访问此资源,则应返回403状态码。
如果请求中未提供授权凭证,则应返回401状态码。

3
如果请求中提供了授权凭据但请求者没有权限访问此资源,则应返回401而不是403。RFC 2616明确指出,对于403,“授权将无助于解决问题,请求不应重复”(http://tools.ietf.org/html/rfc2616#section-10.4.4)。因此,如果存在有效的凭据可以获得访问该资源的权限,则不要返回403。 - Day
@Day 你说得完全正确。我的回答是错误的。嗯,每天都会学到新东西。 - Darrel Miller
没问题。你可以试试我的衍生问题https://dev59.com/Rm855IYBdhLWcg3w_5qm :) - Day
在我的情况下,某种类型的数据库资源可供使用,无论请求者是否已登录。但是,该资源可以根据该网站设置为“私有”或“公共”。在这种情况下,授权凭据是无关紧要的;“它被设置为私有”的非标准状态是决定因素,因此我认为在这种情况下发送回适当的状态是HTTP 403 / Forbidden。 - StackOverflowUser
401表示未登录——403表示已登录,但没有权限。请参见:https://auth0.com/blog/forbidden-unauthorized-http-status-codes/。您的答案是正确的,评论可能会使您认为不是,但您最初是正确的。 - ArthNRick

4

绝对不是404。404只是“未找到”。
401表示访问被拒绝。
403表示被禁止。

我会选择401。


6
401不是"拒绝访问",而是"未登录且需要登录"。 - Eric Stein
2
根据RFC 2616(http://tools.ietf.org/html/rfc2616#section-10.4.2),“如果请求已经包含授权凭据,则401响应表示对这些凭据的授权已被拒绝。”因此,401实际上是访问被拒绝。 - Parth Shah

2

我会使用400错误请求。
因为我的应用程序不会以编程方式访问无法访问的资源。
过滤用户权限并隐藏无法访问的资源是良好的用户体验。
如果我的服务器收到无法访问的请求,这意味着有人试图做某些事情。
这就是为什么我在我的应用程序中选择了400-错误请求。


2
我不同意。对于有效请求响应400 Bad Request是一个有问题的API。400 Bad Request表示请求存在问题。任何使用你的API的人都会认为请求有问题,而实际上请求是正确的,这正是401和403的作用。这样做可以更容易地进行调试。 - Mikkel Løkke
正如我所说,普通用户从不请求无法访问的资源。如果我的服务器收到了无法访问的请求,这意味着有些狡猾的人试图黑客攻击无法访问的资源。此外,对于有效的请求,我永远不会响应错误代码。 - jeefo
通常情况下,您不应该对普通用户的行为做出任何假设。身份验证并不一定是请求的一部分。如果您担心有人会耍花招,正确的解决方案不是故意破坏HTTP(通过混淆来保护安全)。正确的解决方案是在API前面设置防火墙,这样耍花招的人甚至无法探测到您的API。 - Mikkel Løkke
我从未提到过身份验证。我的应用程序中有许多不同的部门和用户角色,因为我的客户是一家非常大的公司。在我的应用程序中有很多私人数据,因此每个用户对我来说都是一个威胁。谁知道他们的计算机是否被黑客攻击了...在前端应用程序中,无法以编程方式访问不可访问的资源。因此,在服务器端,我将通过用户验证每个请求,确保它是有效的请求。如果不是,则停止执行并响应400。 - jeefo

0

0

如果用户具有有效的凭据,但没有权限查看资源,则会出现错误403。如果他未经身份验证并需要进行身份验证,则会出现错误401。根据rfc https://www.rfc-editor.org/rfc/rfc2616#section-10.4.2,错误401表示缺少凭据,而错误403表示其他授权问题,例如尽管已登录但未被授予许可权。但是,仅当您解释拒绝的原因(例如缺乏权限)时,才应使用它。如果未提供对已验证用户拒绝的解释,则可以根据RFC使用404错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接