检查用户 PIN 时使用什么 HTTP 代码响应?

What HTTP Code response to use when checking user PIN?

我有端点 POST /auth/check-pin 和 JSON 正文

{
  "subAccountId": 1,
  "pin": 5555
}

当 subAccountId 不存在或 PIN 错误时,我 return 应该如何响应? 404 表示不存在子帐户,400 表示错误 PIN?

404 for not exists subAccount

不,那肯定是错误的。

HTTP 状态代码是 transfer of documents over a network 域的一部分。它们是一种元数据形式,允许通用组件理解响应的语义。

404 的 HTTP 定义是:

The 404 (Not Found) status code indicates that the origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

目标资源是由请求行中的uri标识的东西。在您的示例中,/auth/check-pin 是此请求的标识符。在此上下文中,404 的含义是我们无法找到 /auth/check-pin——换句话说,target-uri.

中似乎存在拼写错误

这个意思不是特别适合你的情况,因为你请求中的问题在request-body,而不是在target-uri.

比较合理的选择是403 Forbidden, which roughly translates to "I understood what you want, but I'm not going to do it"; 409 Conflict "the current state of the resource doesn't allow us to do that", or 422 Unprocessable Entity.

在实践中——你选择哪一个并不重要,因为除了语义之外,它们之间没有太多标准化的差异(例如,它们对缓存都有相同的含义)。


这里要考虑的第二件事是您想要向试图猜测 PIN 号码的攻击者泄露多少信息。

如果你给我区分无效帐号和有效帐号的能力,这将大大减少我需要花费的密码来破解密码。

所以如果您处于对此敏感的上下文中,那么您根本不想区分无法识别的 subAccountId 和无法识别的 pin。因此,将对两种情况使用相同的状态代码和相同的响应主体,也许:

403 Forbidden

No more information available