我是否应该在没有足够访问权限的情况下向REST API用户返回401或405响应代码?

时间:2012-06-26 03:53:08

标签: api http rest httpresponse http-status-codes

我正在开发一个API,它也有一个身份验证/授权组件。

任何人,无论身份验证状态如何,都能写(POST),但取决于您是否未经身份验证,作为普通用户进行身份验证或作为管理员进行身份验证,以及您尝试访问的资源我将会为GET,DELETE和PUT返回不同的响应。

我正在尝试为未经过身份验证和/或授权的用户找出最合适的响应代码。

请记住http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  

未经授权 - > 401

     

禁止 - > 403

     

不允许的方法 - > 405

让我们使用一个具体的例子:

  • John Doe未经过身份验证,DELETE应该收到401还是405?
  • Amy经过身份验证但未经授权,DELETE是否应该收到403或405?

(请记住,即使John和Amy被禁止或未经授权,并不意味着他们无法使用不同的HTTP VERB访问相同的资源。)

感谢。

2 个答案:

答案 0 :(得分:21)

在这种情况下,我认为提供一些澄清的例子很有用:

  • 未经身份验证+支持的方法= 401
  • 未经身份验证+不支持的方法= 405
  • 经过身份验证+授权+支持的方法= 2xx
  • 经过身份验证+授权+不支持的方法= 405
  • 经过身份验证+未经授权+支持的方法= 403
  • 经过身份验证+未经授权+不支持的方法= 405

换句话说,从程序角度来看:

  1. 检查方法是否受支持。如果不是:405
  2. 如果支持,请检查用户是否已通过身份验证。如果不是:401
  3. 如果已通过身份验证,请检查用户是否已获得授权。如果不是:403
  4. 如果获得授权:2xx
  5. 编辑:我偶然发现了这个图表,并认为这可能对其他可能偶然发现这篇文章的人有用。点击放大。

    https://foo.v3.testing

    原始enter image description here

答案 1 :(得分:12)

405 Method Not Allowed只应在不支持该方法时使用。它不应该被用来告诉客户他们不能使用这种方法。

因此,您案例中唯一优秀的HTTP代码是401 Unauthorized。它指示客户端该方法存在并且需要登录才能访问它。