对于使用错误凭据执行的登录请求,REST API 应返回啥状态代码?

Posted

技术标签:

【中文标题】对于使用错误凭据执行的登录请求,REST API 应返回啥状态代码?【英文标题】:What status code should a REST API return for login requests performed with wrong credentials?对于使用错误凭据执行的登录请求,REST API 应返回什么状态代码? 【发布时间】:2018-01-03 13:21:14 【问题描述】:

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

一些想法:

400 错误响应 我认为这段代码不合适,因为它表示请求在语法上不正确并且服务器不理解,这里不是这种情况。登录数据在语义上不正确。

401 未经授权 这对我来说是棘手的部分。 如果 401 只能发生在需要身份验证标头的请求上,那么这是不正确的。但是如果 401 可以出现在所有需要身份验证的请求上(无论是作为标头还是在正文中),那么 401 就是一个候选。

403 禁止 通常,如果用户已经通过身份验证并且系统已知但请求了他/她不允许访问的资源,则返回 403。 用户在登录之前肯定没有经过身份验证。我不知道对于未经身份验证的用户是否存在 403 语义。

我很高兴被告知答案或听到您的想法。

【问题讨论】:

你写的一切似乎都是正确的,我没有看到任何问题 问题在标题中 给他们一个茶壶错误。为什么要给黑客任何信息? 简答:401,长答案在你的问题中 racksburg.com/choosing-an-http-status-code 【参考方案1】:

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

如果用户通过了身份验证,但没有被授权访问所请求的资源,那么响应的状态应该是 403。403 表示用户被禁止访问资源,无论他们如何更改请求,他们将不允许访问。

在您的端点要求凭据包含在请求正文中的情况下,如果请求正文不符合您的规范,您应该返回 400。

【讨论】:

有这方面的文档吗?我的意思是谁说我们不能发送 200 状态代码作为响应并在正文中提及原因? (我知道这不是一个好习惯,但我正在寻找一本书或参考资料) 这里是规范:w3.org/Protocols/rfc2616/rfc2616-sec10.html 最终,您可以根据需要设计端点,并相应地记录。然而,遵循一个众所周知的标准最不会让您的客户感到惊讶,甚至可能允许他们重用他们现有的一些代码。 是的,我总是和一些开发人员争论,他们说我们回复 200 状态码更好,但在正文中,我们可以回复一个定义的模型,结果表明身份验证因此失败!谢谢约书亚【参考方案2】:

我的问题具体是关于对登录端点的POST 请求,例如,它要求输入用户名和密码以及提供不正确的情况。

这取决于凭据的发送方式:

如果您使用HTTP Authentication(在Authorization 标头中发送凭据),则可以返回401 以指示凭据无效。

如果您在请求正文中发送凭据(例如带有用户名和密码的 JSON),401 似乎不是最合适的状态代码(一旦它不是 真正的 HTTP验证)。在这种情况下,请考虑 403,而不是使用描述性响应负载。


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

【讨论】:

对于第二个项目符号:403 是未经授权的,取决于用户的角色或声明,这可能不足以满足特定的端点/资源,并且与 API 未知的凭据无关。如果用户名/密码未知组合,则应返回 401 而不是 403。令人误解的是 401 被标记为未经授权,因为它应该声明 未经身份验证,而 403 Forbidden 实际上是未经授权的。【参考方案3】:

401 使用 HTTP 身份验证时凭据无效

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

【讨论】:

401 for invalid credentials 不太准确。它应该是:401 用于无效凭据当使用HTTP Authentication时 真的!谢谢,Cássio 我已经更新了答案以澄清。

以上是关于对于使用错误凭据执行的登录请求,REST API 应返回啥状态代码?的主要内容,如果未能解决你的问题,请参考以下文章

针对 REST API 的授权引发错误:401(未找到请求的凭据。)

想要在存在多个凭据的情况下发送 otp 的 Keycloak Rest API 请求格式

使用先前存储在数据库中的凭据执行发送电子邮件的 API 端点。 (使用 Gmail REST API)

未提供 Angular + Django REST 身份验证凭据

通过 REST API 传递“Windows 身份验证”?

在flutter中通过rest api登录验证用户