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

Chr*_* W. 17 api rest http 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访问相同的资源.)

谢谢.

doc*_*uke 22

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

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

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

  1. 检查方法是否受支持.如果不:405
  2. 如果支持,请检查用户是否已通过身份验证.如果不:401
  3. 如果经过身份验证,请检查用户是否已获得授权.如果不:403
  4. 如果授权: 2xx

编辑:我偶然发现了这个图表,并认为它可能对任何可能偶然发现这篇文章的人有用.点击放大.

在此输入图像描述

原来这里.

  • 哇,这非常详细.我向开发者神祈祷,我永远不需要使用超过5%的流程图. (3认同)

lau*_*ent 12

405 Method Not Allowed只有在不支持该方法时才应使用.它不应该用于告诉客户端他们不能使用此方法.

所以你的案例中唯一好的HTTP代码就是401 Unauthorized.它指示客户端该方法存在以及他们需要登录才能访问它.

  • 几乎.一旦您通过身份验证,但不允许进行操作,它将是403. (4认同)
  • Laurent:"服务器理解了请求,但拒绝授权.提供不同的用户身份验证凭据可能会成功,但请求中提供的任何凭据都不够.请求不应该使用相同的凭据重复." - http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p2-semantics-latest.html#status.403 (2认同)