REST API在使用错误凭据进行登录请求时应返回什么状态码?

26

我已经找到了很多关于HTTP状态码含义的答案和解释。我的问题是关于向登录端点进行POST请求的情况,例如要求用户名和密码,以及提供不正确的用户名和密码的情况。

一些想法:

400 Bad Response 我认为这个代码不合适,因为它表示该请求在语法上不正确,服务器无法理解,而这在这里并不是这个情况。登录数据只是语义上不正确。

401 Unauthorized 对我来说,这是一个棘手的部分。 如果只有需要身份验证头的请求才能出现401,则不正确。但是,如果可以在所有需要身份验证(无论是头还是身体)的请求上出现401,则401是候选项。

403 Forbidden 通常,如果用户已经被系统认证并知道该资源但被禁止访问,则返回403。 在登录之前,用户肯定没有被认证。我不知道是否存在未经身份验证的用户的403语义。

我很乐意听到您的答案或想法。


你所写的一切似乎都是正确的,我没有看到任何问题。 - Adam Siemion
3
题目中已经有问题了,请翻译文本内容。 - Peter F
1
抛出一个茶壶错误。何必向黑客提供任何信息呢? - user1228
简短回答:401,详细答案在您的问题中。 - Adam Siemion
http://racksburg.com/choosing-an-http-status-code/ - jonrsharpe
这个回答解决了你的问题吗?如果用户尝试使用不正确的用户名/密码登录,但格式正确,应返回什么适当的HTTP状态码? - Damjan Pavlica
3个回答

35

如果用户尝试进行身份验证,但提供的凭据无效,则响应状态应为401,无论您是否使用基本授权。401表示身份验证失败,但用户可以更改其请求并再次尝试。

如果用户已经通过身份验证,但未被授权访问请求的资源,则响应状态应为403。403表示用户被禁止访问该资源,无论他们如何更改请求,都将不被允许访问。

在您的终端点要求凭证在请求体中的情况下,如果请求体不符合您的规格,应返回400状态码。


有没有关于这个的文档?我的意思是,谁说我们不能在响应中发送200状态代码并在正文中提到原因?(我知道这不是一个好习惯,但我正在寻找一本书或参考资料) - Nader Vaghari
这是规范文件:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html - Joshua Jones
最终,您可以根据自己的需求设计端点,并相应地进行文档编写。然而,遵循一个众所周知的标准将会给客户带来最少的惊喜,甚至可能让他们重用一些现有的代码。 - Joshua Jones
我经常与一些开发人员争论,他们认为最好回复200状态码,但在正文中,我们可以回复一个定义的模型,其中包含结果,说明身份验证失败的原因!谢谢Joshua。 - Nader Vaghari

4
我的问题特别关于对登录端点的POST请求,它会要求提供用户名和密码,例如当提供了错误的用户名或密码时的场景。
这取决于凭据是如何发送的:
  • 如果你正在使用 HTTP身份验证 (在 Authorization 头中发送凭据),你可以返回 401 来表示凭证无效。

  • 如果你在请求体中发送凭据(例如,使用用户名和密码的JSON数据),401 状态码似乎不是最合适的(因为这不是一个真正的HTTP身份验证)。在这种情况下,考虑使用 403 并提供一个描述性的响应有效负载。


403 状态码也可以用于指示授权问题,即指示用户不被允许执行某个操作。


2
对于第二个要点:403表示未经授权,这取决于用户所拥有的角色或声明,可能不足以访问特定的端点/资源,并且与API未知凭据无关。如果用户名/密码组合未知,则应返回401而不是403。误导人的是,401被标记为未经授权,而它应该标明未认证,而403禁止实际上是未经授权的。 - Youp Bernoulli

2

当使用HTTP认证时,401表示凭据无效。

403表示用户已登录但尝试访问未被允许的区域。


“401”对于无效凭据并不十分准确。应该是:在使用HTTP身份验证时,“401”表示无效凭据。HTTP身份验证 - cassiomolin
1
真的!谢谢,Cássio。我已经更新了答案以澄清。 - fv_dev

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