我有带有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