OAuth 2.0 资源服务器自定义错误格式

OAuth 2.0 resource server custom error format

OAuth 2.0 specification is very clear on the errors returned by the authorization server in Section 5.2. Error Response :

  • error : REQUIRED.

[...]

The parameters are included in the entity-body of the HTTP response using the "application/json" media type as defined by [RFC4627].

甚至还提供了示例 HTTP 响应:

 HTTP/1.1 400 Bad Request
 Content-Type: application/json;charset=UTF-8
 Cache-Control: no-store
 Pragma: no-cache

 {
   "error":"invalid_request"
 }

当涉及到资源服务器(受保护的HTTP资源)时,RFC在Section 7.2中对这部分内容含糊不清:

If a resource access request fails, the resource server SHOULD inform the client of the error.
While the specifics of such error responses are beyond the scope of this specification, this document establishes a common registry in Section...

一个人可能已经有了自己的自定义错误响应“数据结构”。 默认情况下,spring-security-oauth2 等实现对授权服务器和资源服务器使用相同的错误格式。

这种默认行为会导致 API 客户端针对授权错误和业务错误处理两种不同的数据结构,这非常不方便。

另一方面,我发现根据授权框架来塑造 HTTP API 的错误真的很奇怪:尤其是当我们对相同的资源使用多种类型的 authorization/authentication 时。

在这一点上,我发现对所有资源服务器错误使用相同的用户定义错误结构更具吸引力,包括与 OAuth 相关的授权错误,如“invalid_token”。

例如:

{
  "error": {
    "code":"1001"
    "type":"invalid_token"
    "message":"Expired access token"
  }
  ...
}

问题: 为资源服务器定义我们自己的错误响应格式是否是一种“坏”/不常见的做法?我可能忘记考虑的任何元素?

我们的想法是尽可能对用户友好。

与大多数 Spring 安全身份验证错误一样,此错误由 AuthenticationEntryPoint 处理。默认情况下,您会将 OAuth2AuthenticationEntryPoint 注入到 OAuth2AuthenticationProcessingFilter 中,但您可以通过自己构建过滤器或将其推送到 ResourceServerConfigurer 回调中来添加自己的。

客户端和授权服务器之间的接口定义明确的原因是互操作性。客户端应该能够(或多或少)使用任意授权服务器。

另一方面,客户端和资源服务器之间的接口定义不太明确。这是因为客户端在本质上更紧密地绑定到资源服务器,因为它需要先了解 API 特定的语义和 API 的语法,然后才能用它做一些有用的事情。语义和语法将自身扩展到 API.

的错误处理

但是,如果您同时控制资源服务器和客户端,从开发人员的角度来看,采用与 OAuth 2.0 相同的方法来使客户端的错误处理更加统一可能是有意义的。这并不少见,当然也不是坏习惯。这完全取决于您(即资源服务器实施者)。