rest - 正确的需要授权的资源的http状态代码

标签 rest http-status-codes

如果用户尝试访问需要用户登录的页面,对于要返回的正确 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 是正确的,但 200302 是最好的。

嘿!这就是我正在寻找的:最好的解决方案。但最好的不应该和正确的一样吗?为什么它是最好的?

感谢所有提出这个问题的人:)

我知道我不应该太担心。而且我认为这个问题更具假设性(不是真的,而是因为缺乏更好的词而使用它)。

但是这个问题已经困扰我一段时间了。

如果我是一名经理(他们只是像往常一样拿起一些听起来很酷的词)我会说:但是,但是,但是,但是休息很重要。 :-)

那么:在上述情况下(如果有的话)使用状态代码的正确方法™是什么?

tl;博士

当用户尝试访问需要登录的页面时,正确的 http 状态代码响应是什么?

最佳答案

如果用户未提供任何凭据,而您的 API 需要这些凭据,则返回 401 - 未经授权。这将挑战客户这样做。对于这种特殊情况通常很少有争论。

如果用户提供了有效的凭据,但不足以访问所请求的资源(可能这些凭据适用于免费增值帐户,但所请求的资源仅适用于您的付费用户),则您有考虑到一些 HTTP 代码定义的松散性,有几个选项:

  1. 返回403 - 禁止。这更具描述性,通常被理解为“提供的凭据有效,但仍不足以授予访问权限”
  2. 返回401 - 未经授权。如果您对安全性有偏执,您可能不想将上面 (1) 中返回的额外信息返回给客户端
  3. 返回 401403,但在响应正文中提供有用的信息,描述访问被拒绝的原因。同样,这些信息可能比您想要提供的更多,以防它对攻击者有所帮助。

就我个人而言,对于已传递有效凭据但与其关联的帐户无权访问所请求资源的情况,我始终使用#1。

关于rest - 正确的需要授权的资源的http状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8389253/

相关文章:

java - 使用 Google API 客户端库的 Http 请求

angularjs - 如何解决http状态码-1错误

http - 如果请求缺少必需参数,我应该使用什么 HTTP 状态响应代码?

java - 是否可以在单个 Rest 服务调用中检索 Image 和 JsonObject?

java - Spring 4 vs Jersey 用于 REST Web 服务

spring - IdentityServer4 API 资源和 Spring 框架

jakarta-ee - Java.lang.throwable和错误代码

http - 对于输入的旧密码不正确的更改密码请求,正确的 HTTP 响应是什么?

java - 如何在我的 RestService 中创建 URL?

java - REST Java 类 java.util.LinkedList 的消息正文编写器