【问题标题】:Should the HTTP status code for password validation failure be 400?密码验证失败的 HTTP 状态码应该是 400 吗?
【发布时间】:2021-06-02 04:07:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这能回答你的问题吗? REST response code for invalid data
  • 从我链接的欺骗目标中,您应该回复 400 并更改原因短语或在正文中包含任何错误详细信息。

标签: rest http response http-status-codes http-status-code-400


【解决方案1】:

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 消息,而“海象”作为消息中的值在语义上是无意义的,因为它违反了政策。所以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,blue,white

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

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

guess=red,blue,blue,walrus

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

【讨论】:

    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 2017-06-02
    • 2021-02-03
    • 2015-04-19
    • 2022-07-23
    • 2020-09-21
    • 2021-11-09
    • 2012-05-30
    相关资源
    最近更新 更多