【问题标题】:Response code 400 or 403 for POST Restful APIsPOST Restful API 的响应代码 400 或 403
【发布时间】:2016-08-19 20:29:18
【问题描述】:

我正在设计一个 POST Restful API,在这种情况下,我必须根据请求正文中提供的元素之一授权用户。 例如。

{
division : "1",
name : "MyName",
address:{
no : 123,
street : "abc",
pincode : 222111
}
....
}

所以发出 POST 请求的用户应该被授权在第 1 部门工作。我无法在没有获取请求正文的情况下授权用户。

还要验证一些属性,我必须在 DB 中进行大量的 DB 调用,例如,检查上述地址是否具有有效的 pincode 值。

所以我的问题是我应该如何将错误代码返回给用户 -

  1. [编辑]如果请求中的除法无效(系统中不存在的东西) - 400 或 403?
  2. 如果提供了划分,但用户未经授权且密码无效 - 400 表示无效密码或 403?
  3. 如果 pincode 是必需属性且请求中未提供,则错误代码应该是什么。我应该先检查 403 再检查 400 还是反过来?

基本上哪个错误代码继续另一个?

也可以这样做:

400 – request is bad, syntactically (division/pincode or other mandatory values not provided)
403 – authorize user
400 – request is bad, data specific validation (heavier operation, requiring to hit DB)

[编辑] 我们不希望使用 422 错误代码

【问题讨论】:

  • 请不要依赖用户告诉你他们被授权做什么! POST 请求非常容易查看和编辑;有人告诉你他们可以做任何他们想做的事,这是微不足道的。用户应该表明自己的身份,并且告诉他们他们可以做什么。
  • ${personalDeity} !请原谅我,但我对您的应用程序知之甚少,这表明您对安全性一无所知。 不要自己实现授权和身份验证例程。鉴于您展示的知识,您将惨败。使用经过验证的框架,例如 Apache ShiroSpring Security

标签: web-services rest


【解决方案1】:

如有疑问,请查看RFC

400 错误请求

由于格式错误,服务器无法理解请求 句法。客户端不应该重复请求 修改。


403 禁止

服务器理解请求,但拒绝执行。 授权将无济于事,并且不应重复请求。如果 请求方法不是 HEAD 并且服务器希望公开 为什么请求没有被满足,它应该描述原因 对于实体的拒绝。如果服务器不想让 此信息可供客户端使用,状态码 404(不 Found) 可以代替。

如果请求中没有提供分割 - 400 或 403?

我认为两者都不适用。语法 - 尽管它缺少一些数据 - 不是格式错误。
由于上述引用中提到的原因,403 似乎也不正确:授权无济于事等。

422 Unprocessable Entity怎么样?

422 无法处理的实体(WebDAV;RFC 4918)

请求格式正确,但由于以下原因无法执行 语义错误。

这是我通常在这种情况下使用的。

如果提供了划分,但用户未经授权且密码无效 - 400 表示无效密码或 403?

同样,我认为 400 或 403 在这里都不是一个好案例。专门针对这种情况,存在401

401 未经授权

类似于 403 Forbidden,但 专门用于身份验证时 是必需的,但已失败或尚未提供。响应 必须包含一个包含挑战的 WWW-Authenticate 标头字段 适用于请求的资源。请参阅基本访问身份验证 和摘要访问身份验证。

【讨论】:

  • 感谢您的回答,我忘了在我的问题中提到一件事,我们不希望使用 422 错误代码。如果 pincode 是强制性属性并且未在请求中提供,那么我的错误代码应该是什么。我应该先检查 403 再检查 400 还是反过来?
  • 还有一个-如果请求正文中的除法无效怎么办
  • 我认为 403 不适用于您的任何情况。如果您不能或可能不使用 422,您总是可以使用 400 作为一般情况,但 422 更好
  • 401 与 403 有所不同,因此,在我的情况下,用户在提供的部门中被授权但被禁止。我应该问 - 我应该先验证请求正文然后进行授权部分,还是先检查部门然后进行授权然后进行其余的正文验证?
  • @VineetSingla 先授权。如果用户未获得授权,则无需处理请求的其余部分
【解决方案2】:

我认为你在正确的轨道上。假设每个请求都通过(http 授权标头)进行身份验证

  1. 返回 400,丢失数据是可以的,此外,您可以添加错误响应正文,解释客户端请求不被接受的原因(在本例中为丢失的部门)。

    李>
  2. 返回 403,如果发出请求的客户端无权与资源交互(在本例中为部门),则返回 403。

  3. 您必须先验证客户端是否有权与资源进行交互,因此必须先发送 403,如果缺少必填字段,您可以将其视为 400(有适当的解释)。

如果客户端未通过身份验证,正确的响应应该是 401,但正如我之前所说,我的响应中的 1) 和 2) 是假设客户端已针对服务器进行身份验证。

希望对你有帮助,

何塞·路易斯

【讨论】:

  • 完成,现在在响应中。
  • 还有一个-如果请求正文中的除法无效怎么办?提前致谢
  • 第二个你错了。 403与是否被授权无关。你根本无法访问它
  • @VineetSingla 将是 400,因为请求格式错误,因此服务器无法处理,再次让客户端知道哪个字段错误,以便他们了解更多信息。
  • @TimCastelijns 请检查en.wikipedia.org/wiki/HTTP_403,尤其要检查:A 403 response generally indicates one of two conditions: Authentication was provided, but the authenticated user is not permitted to perform the requested operation. The operation is forbidden to all users. Repeating the request with authentication would serve no purpose. 在这种情况下,第一个条件是适用的。
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 2023-02-21
  • 1970-01-01
  • 2016-10-20
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多