身份验证服务允许禁用用户帐户(一种软删除)。
如果服务器接收到禁用用户的身份验证请求,否则该服务器将返回401或403?使用任一状态代码,我都会返回一条消息,表明该帐户已被禁用。
为了快速参考,HTTP/1.1 spec(强调我的)的相关引用:
401未经授权
请求需要用户身份验证。响应必须包括一个 包含挑战的WWW-Authenticate头字段(第14.47节) 适用于所请求的资源。 客户可以重复 请求使用合适的授权标头字段(第14.8节)。 如果 请求已包含授权凭据,然后是401 响应表明授权已被拒绝 凭证即可。如果401响应包含与之相同的挑战 先前的响应,用户代理已经尝试过 验证至少一次,然后用户应该出现 响应中给出的实体,因为该实体可能 包括相关的诊断信息。 HTTP访问身份验证 在“HTTP身份验证:基本和摘要访问”中进行了解释 身份验证“[43]。
403禁止
服务器理解请求,但拒绝履行请求。 授权无效,请求不得重复。 如果请求方法不是HEAD并且服务器希望进行 公开为什么请求没有得到满足,应该描述 实体拒绝的原因。如果服务器不希望 将此信息提供给客户端,状态代码404 (未找到)可以代替使用。
答案 0 :(得分:41)
根据an email撰写的Roy T. Fielding,当前的HTTP规范中显然有a bug。
要阅读的预期规范的方式如下(使用上述电子邮件中的引号):
401“未经身份验证”:
你不能这样做,因为你没有经过身份验证
403“未经授权”:
用户代理发送了有效凭据但无权访问
因此,对于已禁用的用户,403是正确的响应(404也是一个选项)。
答案 1 :(得分:11)
在这种情况下,我有两个不同的答案。
语义选择 - 401未经授权。在这种情况下,您的客户端已提供凭据,并且已根据特定凭据拒绝该请求。如果客户端要使用不同的凭据集再次尝试,或者将来要重新启用该帐户,则相同的请求可能会成功。
安全选择 - 404 Not Found。许多服务只会为任何故障返回404,以避免信息泄露。我立即想到了Github。
来自General API Information,在github的开发者文档中:
未经身份验证的请求将返回404以防止任何类型 私人信息泄露。
对于我作为公共服务部署的内容,我可能会使用404来避免向攻击者提供有关其凭据尝试的线索。如果仅供内部消费或测试,我可能会返回401.
答案 2 :(得分:2)
返回401告诉调用者该帐户无效,这是正确的,但如果您的api将再次被调用以注册具有相同凭据的用户,则呼叫也将失败。这可能对调用者没什么用处。
所以,这实际上取决于你的api将如何被使用以及目标受众是谁/是什么。