HTTP 401未授权或403禁止“禁用”用户?

时间:2012-02-09 23:14:39

标签: http rest restful-authentication

身份验证服务允许禁用用户帐户(一种软删除)。

如果服务器接收到禁用用户的身份验证请求,否则该服务器将返回401或403?使用任一状态代码,我都会返回一条消息,表明该帐户已被禁用。

为了快速参考,HTTP/1.1 spec(强调我的)的相关引用:

401未经授权

  

请求需要用户身份验证。响应必须包括一个     包含挑战的WWW-Authenticate头字段(第14.47节)     适用于所请求的资源。 客户可以重复     请求使用合适的授权标头字段(第14.8节)。 如果     请求已包含授权凭据,然后是401     响应表明授权已被拒绝     凭证即可。如果401响应包含与之相同的挑战     先前的响应,用户代理已经尝试过     验证至少一次,然后用户应该出现     响应中给出的实体,因为该实体可能     包括相关的诊断信息。 HTTP访问身份验证     在“HTTP身份验证:基本和摘要访问”中进行了解释     身份验证“[43]。

403禁止

  

服务器理解请求,但拒绝履行请求。     授权无效请求不得重复。     如果请求方法不是HEAD并且服务器希望进行     公开为什么请求没有得到满足,应该描述     实体拒绝的原因。如果服务器不希望     将此信息提供给客户端,状态代码404     (未找到)可以代替使用。

3 个答案:

答案 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将如何被使用以及目标受众是谁/是什么。