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



我有带有JSON主体的端点POST /auth/check-pin

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

当subAccountId不存在或PIN错误时,我应该返回什么响应?404表示不存在子帐户,400表示PIN错误?

404不存在子账户

不,这肯定是错误的。

HTTP状态代码是通过网络域传输文档的一部分。它们是一种元数据形式,允许通用组件理解响应的语义。

404的HTTP定义是:

404(未找到(状态代码表示源服务器未找到目标资源的当前表示形式,或者不愿意公开该表示形式的存在。

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

这意味着不太适合您的情况,因为您的请求中的问题在请求体中,而不是在目标uri中。

更合理的选择是403 Forbidden,大致翻译为"禁忌";我明白你想要什么,但我不会这么做;;409冲突";资源的当前状态不允许我们这样做";,或422不可处理实体。

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


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

如果你让我能够区分无效账号和有效账号,这将大大减少我需要花费的钱。

因此,如果您所在的上下文对此很敏感,那么您根本不想区分未识别的subAccountId和未识别的pin。因此,对于这两种情况,可能会使用相同的状态代码和相同的响应主体:

403 Forbidden
No more information available

最新更新