如果用户尝试访问需要用户登录的页面,对于要返回的正确 http 状态代码似乎存在很多困惑。
那么当我显示登录页面时,基本上会发送什么状态代码?
我很确定我们需要使用 4xx
范围内的状态代码。
我在这里讨论的不是 HTTP 身份验证,因此我们至少不会使用 1 个状态代码 (401 Unauthorized
)。
现在我们应该使用什么?答案(也在此处)似乎有所不同:
根据答案here我们应该使用403 Forbidden
。
但是在状态码的描述中是:
Authorization will not help and the request SHOULD NOT be repeated.
嗯,这看起来不太合适。因为授权会有帮助。
那么让我们看看其他一些答案。答案here Even 根本不使用 4xx
范围,而是使用 302 Found
302 Found
状态代码的描述:
The requested resource resides temporarily under a different URI. Since the redirection might be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.
我想这也不是我想要的。因为它不是驻留在不同 URI 下的请求资源。而是完全不同的资源(登录页面与经过身份验证的内容页面)。
所以我继续选择另一个 answer令人惊讶的是还有另一种解决方案。
此答案建议我们选择400 Bad Request
。
该状态码的描述为:
The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.
我认为服务器很好地理解了该请求,但只是在用户经过身份验证之前拒绝授予访问权限。
另一个answer还表示 403
响应是正确的,但其结尾为:
If this is a public facing website where you are trying to deny access based on a session cookie [that's what I do], 200 with an appropriate body to indicate that log in is needed or a 302 temporary redirect to a log in page is often best.
所以 403
是正确的,但 200
或 302
是最好的。
嘿!这就是我正在寻找的:最好的解决方案。但最好的不应该和正确的一样吗?为什么它是最好的?
感谢所有提出这个问题的人:)
我知道我不应该太担心。而且我认为这个问题更具假设性(不是真的,而是因为缺乏更好的词而使用它)。
但是这个问题已经困扰我一段时间了。
如果我是一名经理(他们只是像往常一样拿起一些听起来很酷的词)我会说:但是,但是,但是,但是休息很重要。 :-)
那么:在上述情况下(如果有的话)使用状态代码的正确方法™
是什么?
tl;博士
当用户尝试访问需要登录的页面时,正确的 http 状态代码响应是什么?
最佳答案
如果用户未提供任何凭据,而您的 API 需要这些凭据,则返回 401 - 未经授权
。这将挑战客户这样做。对于这种特殊情况通常很少有争论。
如果用户提供了有效的凭据,但不足以访问所请求的资源(可能这些凭据适用于免费增值帐户,但所请求的资源仅适用于您的付费用户),则您有考虑到一些 HTTP 代码定义的松散性,有几个选项:
- 返回
403 - 禁止
。这更具描述性,通常被理解为“提供的凭据有效,但仍不足以授予访问权限” - 返回
401 - 未经授权
。如果您对安全性有偏执,您可能不想将上面 (1) 中返回的额外信息返回给客户端 - 返回
401
或403
,但在响应正文中提供有用的信息,描述访问被拒绝的原因。同样,这些信息可能比您想要提供的更多,以防它对攻击者有所帮助。
就我个人而言,对于已传递有效凭据但与其关联的帐户无权访问所请求资源的情况,我始终使用#1。
关于rest - 正确的需要授权的资源的http状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8389253/