POST Restful API的响应码为400或403

10

我正在设计一个POST Restful API,其中我有这样一种情况,需要根据请求体中提供的元素之一对用户进行授权。

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

因此,发出POST请求的用户应该被授权在第一部门工作。如果没有获取到请求正文,我无法对用户进行授权。

另外,为了验证某些属性,我不得不在数据库中进行大量的DB调用,例如,检查上述地址是否具有有效的邮政编码值。

因此,我的问题是如何向用户返回错误代码:

  1. [编辑]如果请求中提供的部门无效(即系统中不存在)- 400或403?
  2. 如果提供了部门,但未经授权且邮政编码无效的用户- 400表示无效的邮政编码或403?
  3. 如果邮政编码是必需的属性并且在请求中未提供,应该使用什么错误代码。我应该先检查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请求非常容易查看和编辑;某人只需告诉您他们被允许做任何事情就是微不足道的。用户应该确认自己的身份,然后告诉他们他们被允许做什么。 - anaximander
1
${personalDeity}!请原谅我,但是根据我所了解的关于您应用程序的一点儿知识,您在安全方面的认识几乎为零。请务必不要自行实现授权和认证例程。鉴于您显示出的知识水平,这将会带来严重的失败。使用像Apache ShiroSpring Security 这样经过验证的框架。 - Markus W Mahlberg
这个回答解决了你的问题吗?如果引用其他实体失败,POST请求应该返回404吗? - Mark
2个回答

12

有疑问时,可以查看RFC

400 坏请求

由于格式不正确,服务器无法理解该请求。客户端不应在未经修改的情况下重复该请求。


403 禁止访问

服务器理解该请求,但拒绝执行。授权将无济于事,不应重复该请求。如果请求方法不是 HEAD,并且服务器希望向公众说明为什么未能完成该请求,则应在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态码 404(未找到)代替。

如果请求中没有提供division字段-400还是403?

我认为都不适用。尽管缺少一些数据,但语法是格式不正确的。
此外,由于以上引用中提到的原因,“禁止访问”(403)似乎不正确。

422 Unprocessable Entity怎么样?

422 Unprocessable Entity (WebDAV; RFC 4918)

请求格式正确,但由于语义错误无法继续执行。

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

如果提供了division字段,但用户未经授权并且pincode无效-400用于无效的pincode还是403?

同样地,我不认为400或403适用于这种情况。特别针对此情况,存在401状态码。

401 未经授权

与403 Forbidden类似,但专门用于需要身份验证但身份验证失败或尚未提供时使用。响应必须包括一个WWW-Authenticate头字段,其中包含适用于所请求资源的挑战(challenge)。请参见基本访问认证和摘要访问认证。

谢谢您的回答,我在问题中忘记提到一件事,即我们更喜欢不使用422错误代码。如果pincode是必填属性且未在请求中提供,我的错误代码应该是什么?我应该先检查403还是400,或者反过来? - Vineet Singla
再来一条- 如果请求体中的除法无效怎么办? - Vineet Singla
我认为403不适用于您的任何情况。如果您不能或不允许使用422,则始终可以退回到400作为一般情况,但422更好。 - Tim
1
请先进行授权@VineetSingla。如果用户未经授权,则无需处理其余请求。 - Tim
让我们在聊天中继续这个讨论 - Vineet Singla
显示剩余3条评论

0

我认为你走在正确的轨道上。假设每个请求都是通过 (http authorization header) 进行身份验证的。

  1. 缺少数据时返回400是可以的,而且你还可以添加错误响应体来解释客户端请求未被接受的原因(在这种情况下是缺少部门)。

  2. 如果发出请求的客户端没有权限与资源互动(在这种情况下是部门),则返回403是可以的。

  3. 你必须先验证客户端是否有权与资源互动,所以必须先发送403,并且如果缺少必需字段,则可以将其视为400(附带适当的解释)。

如果客户端未经身份验证,则正确的响应应该是401,但像我之前说的,我的回复中的1)和2)假定客户端已对服务器进行了身份验证。

希望对你有所帮助,

Jose Luis


完成,已经在响应中了。 - jbarrueta
还有一个问题-如果请求体中的除法无效怎么办?提前致谢。 - Vineet Singla
3
你在第二点上是错误的。403并不是关于是否被授权的问题。你根本就无法访问它。 - Tim
@VineetSingla 这将是一个400错误,因为请求格式不正确,服务器无法处理它。再次让客户端知道哪个字段有误,以便他们获得更多信息。 - jbarrueta
@TimCastelijns 请查看http://en.wikipedia.org/wiki/HTTP_403,特别是这一段:“403响应通常表示以下两种情况之一:1.已提供身份验证,但经过身份验证的用户不被允许执行所请求的操作。 2.该操作对所有用户都是禁止的。使用身份验证重复请求将毫无意义。”在这种情况下,适用的是第一个条件。 - jbarrueta
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接