0

问题

应用程序希望客户端Authorization在大多数路由上发送带有访问令牌的标头。现在有一个新功能,一些新的少数路由不仅需要请求Authorization头,还需要pin请求正文中包含 6 长度字符串的属性。如果该pin值与用户存储在数据库中的值不匹配pin,则应拒绝该请求。

由于用户已通过身份验证(它在标头中发送了有效的访问令牌Authorization)但发送了错误的值,应该使用哪个状态代码来拒绝请求pin

语境

此应用程序现在将支持支付,并且在请求正文中需要该pin属性的路由是进行支付的路由,因此它们在应用程序内花费用户的积分。这就是为什么它只需要pin在几条路线上发送。

我认为的解决方案

  1. 由于正文 422 Unprocessable Entity中的值错误,无法处理请求,因此请使用。pin
    • 问题:当其他一些验证失败时也会发送状态码422,所以看起来不正确,因为它pin与授权更相关。
  2. 使用401 Not Authorized错误pin值意味着用户未能提供所有正确的凭据。
    • 问题:到目前为止,用户实际上为应用程序在每条路由上所期望的内容提供了正确的凭据。在新功能之后,被视为在应用程序中进行身份验证所需的凭据将不匹配。现在401将意味着两种错误,而不是仅对用户进行身份验证
  3. 使用403 Forbidden.
    • 问题:虽然用户是不允许的,但这不是角色权限的问题。

pin额外的问题:在标头而不是正文中发送是否更好?

4

1 回答 1

0

我认为 422、403 和 400 都“足够好”。我可能会选择 400,因为这是一种特殊的情况,恕我直言,没有一个状态代码完全适合。

于 2019-08-01T18:49:17.187 回答