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

问题描述

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

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

当subAccountId不存在或PIN错误时,我应该返回什么响应?

解决方法

404不存在的子帐户

不,那肯定是错误的。

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

404的HTTP定义是:

404(未找到)状态代码表示原始服务器未找到目标资源的当前表示,或不愿意透露该资源的存在。

目标资源是请求行中uri标识的事物。在您的示例中,/auth/check-pin是此请求的标识符。在这种情况下,404的含义是我们找不到/auth/check-pin,换句话说,目标uri中似乎存在拼写错误。

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

更合理的选择是403 Forbidden,其大致翻译为“我了解您想要的东西,但我不会这么做”; 409 Conflict“资源的当前状态不允许我们这样做”或422 Unprocessable Entity

在实践中-选择哪种选择并不重要,因为除了语义之外,它们之间没有很多标准化的区别(例如,它们对缓存的含义相同)。


这里要考虑的第二件事是要向试图猜测密码的攻击者提供多少信息。

如果您让我能够区分无效帐号和有效帐号,那么这将大大减少我花在破坏密码上的费用。

因此如果您所处的环境对此很敏感,那么您将根本不想在无法识别的subAccountId和无法识别的图钉之间进行区分。因此,可能会在两种情况下使用相同的状态代码和相同的响应正文,

403 Forbidden

No more information available