微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

密码验证失败的 HTTP 状态码应该是 400 吗?

如何解决密码验证失败的 HTTP 状态码应该是 400 吗?

我有一个 API 端点,可根据一组预定义的密码策略规则检查密码是否有效。当密码符合策略时,端点返回200;否则它应该返回别的东西。

我想知道返回 400 是否合适,因为包含错误密码的请求本身并不是错误的请求。服务器完全理解请求,完全可以预料到一个错误的密码,就像一个好的密码一样;只是我们需要告诉客户端密码不适合用于创建帐户或更改密码。

是否有任何用于此目的的 HTTP 状态?或者,好的和坏的密码都应该用 200 来响应,但详细信息应该在响应正文中,例如{"validPassword": true} 还是 {"validPassword": false,"reason": "too long"}

注意:此问题与请求的无效数据无关。这是关于调用专门用于检查密码格式是否有效的 API。无效的密码仍然是请求的有效数据。请不要提出有关“无效请求”的其他问题。

解决方法

HTTP 状态代码属于 transfer of documents over a network 域,而不属于文档所涉及的域。

例如,如果我有一个描述密码“walrus”是否符合某些策略的文档,我可能会尝试使用类似的请求来检索该文档

GET /policy?password=walrus

返回给我的文档可能是对“海象”符合政策的解释,也可能是违反政策的列表。但是在文档传输域中,对查询的响应是文档的当前表示,因此适当的状态代码是 200。

400 不合适,因为该代码表明 (a) 响应的消息正文是对错误解释的表示(而不是我们要求的文档的副本)和 (b) 更多准确表示请求的格式不正确。

更一般地说,成功检索到的文档说明您不在的快乐路径上仍然是成功检索到的文档,并且应该获得 2xx 状态代码,就像您在只需从网站下载有关该密码的网页即可。


当您向服务器发送更改而不是从中获取信息时,有更多的可能性。

POST /e363c9c3-03a9-43fa-9e1c-fe5cad95fb04 HTTP/x.y
Content-Type: application/x-www-form-urlencoded

action=changePassword&password=walrus

这里,报告客户端错误是完全合理的,理由是负载应该是 changePassword 消息,而“walrus”作为消息中的值在语义上是无意义的,因为它违反了政策.因此,422 Unprocessable Entity 可能是一个选项,或者 409 Conflict403 Forbidden -- 所有有效的方式来通知通过网络域传输文档的请求不令人满意。


想象一个益智游戏,比如mastermind,玩家试图解决这个谜题。这样的请求可能看起来像

POST /puzzles/59bfc5a5-8e5b-4bf9-b6fd-52c7b3634b3c HTTP/x.y
Content-Type: application/x-www-form-urlencoded

guess=red,blue,white

即使这个猜测是“错误的”,它仍然是游戏域内的有效请求;游戏本身更新,玩家得到提示,一行解码板被消耗,等等。即使玩家没有赢得比赛,2xx 成功代码仍然是合适的。

POST /puzzles/59bfc5a5-8e5b-4bf9-b6fd-52c7b3634b3c HTTP/x.y
Content-Type: application/x-www-form-urlencoded

guess=red,walrus

在这里,我们将返回 422,因为请求本身已损坏(在这种情况下,海象是“语义错误的”)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。