如果用户尝试使用不正确的用户名/密码但格式正确的登录,返回什么合适的HTTP状态代码?


81

这里发布了一个类似的问题:REST API服务针对验证失败返回什么合适的HTTP状态代码?

上面线程中的答案指出:“例如,如果URI应该具有ISO-8601日期,而您发现它的格式错误或引用的日期是2月31日,则您将返回HTTP 400。实体主体中格式正确的XML,并且无法解析。”

但是,如果用户提交了正确格式的数据会怎样?我的意思是,用户为用户名和密码提交了简单的字母字符串/文本(这对我的应用程序完全有效)。唯一的问题是密码与用户名不匹配。在这种情况下,400将是不正确的,因为它是完全有效的语法并且格式正确。

401不正确(如此处的建议:哪个HTTP状态代码表示用户名或密码不正确?),因为用户没有尝试访问任何页面,他只是在尝试登录和输入不匹配的数据。

如果您回头看我链接到的第一篇文章,第二个回答指出422是正确的响应(并且对我来说看起来是正确的),但是,我使用的是Django Rest Framework,而422不是状态代码的一部分(可以在以下位置找到DRF的一部分状态代码列表:http : //www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx

404的外观也不正确,因为已成功接受数据并且未拒绝数据。

话虽如此,应该使用的真正正确答案是什么?

Answers:


113

正确的HTTP代码实际上是401。来自RFC

401(未经授权)状态码表示该请求尚未应用,因为它缺少目标资源的有效身份验证凭据。产生401响应的服务器必须发送WWW-Authenticate头域(4.1节),该域包含至少一个适用于目标资源的质询。

如果请求包括身份验证凭据,则401响应指示已拒绝这些凭据的授权。 用户代理可以用一个新的或替换的Authorization标头字段(第4.2节)重复该请求。


哦,您是对的,我应该使用401。哇,不敢相信我错过了解释的第二部分。谢谢。如果允许,我会在8分钟内将此问题标记为正确。
user2719875 2015年

从您引用的部分来看,一个401响应指示该请求尚未应用。因此,甚至没有进行任何登录尝试,因为首先需要较低级别的授权。这通常在嵌套多层安全性时发生,并且是有效的响应,用于指示在尝试对内部层进行身份验证之前需要对外部层进行身份验证的要求。
频谱

2
@sjagr>实际上,我评论了一下,因为我将您对同一问题的回答链接到了这里:stackoverflow.com/a/32897804/3212865。要点是问题混合了不同层次的通信,最正交的响应实际上是200,这意味着“请求已成功处理,并相应地尝试了登录,并在响应的内容中找到结果”。尝试在传输级状态码中表示应用程序级错误是设计错误。
光谱

7
我认为这个答案是错误的。对伴随WWW-Authenticate隐含符号401的要求是提示通过HTTP Basic或类似方式进行身份验证。对于失败的登录(在典型的基于cookie的登录方案中),您应使用403,如以下答案所述:webmasters.stackexchange.com/questions/24443/…–
callum

1
这似乎要进行某种解释,这取决于采取某些表述的方式。我的理解是,该请求缺少有效的身份验证凭据,而不是根本没有凭据。由于第二部分仍然提到请求首先可能包含凭据,因此我认为401状态正确。
sjagr


-20

我认为最好将响应状态代码设置为200。防止词表攻击。在巨大的网络犯罪分子中,无法确定哪个请求和响应是正确的)))


4
这就是速率限制和超时/黑名单的用途。
T1960CT

5
“网络罪犯”可以解析响应的正文。
dionyziz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.