编程知识 cdmana.com

Spring Security 实战干货:OAuth2授权请求是如何构建并执行的

在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2AuthorizationRequestRedirectFilter,并找到了真正发起OAuth2授权请求的方法sendRedirectForAuthorization。但是这个方法并没有细说,所以今天接着上一篇把这个坑给补上。

2. sendRedirectForAuthorization

这个sendRedirectForAuthorization方法没多少代码,它的主要作用就是向第三方平台进行授权重定向访问。它所有的逻辑都和OAuth2AuthorizationRequest有关,因此我们对OAuth2AuthorizationRequest进行轻描淡写是不行的,我们必须掌握OAuth2AuthorizationRequest是怎么来的,干嘛用的。

OAuth2AuthorizationRequestResolver

这就需要去分析解析类OAuth2AuthorizationRequestResolver,其核心方法有两个重载,这里分析一个就够了。

@Overridepublic OAuth2AuthorizationRequest resolve(HttpServletRequest request) { // registrationId是通过uri路径参数/oauth2/authorization/{registrationId}获得的 String registrationId = this.resolveRegistrationId(request); // 然后去请求对象request中提取key为action的参数,默认值是login String redirectUriAction = getAction(request, "login"); // 然后进入根本的解析方法 return resolve(request, registrationId, redirectUriAction);}

上面方法里面的resolve(request, registrationId, redirectUriAction)方法才是最终从/oauth2/authorization提取OAuth2AuthorizationRequest的根本方法。代码太多但是我尽量通俗易懂的来进行图解。resolve方法会根据不同的授权方式(AuthorizationGrantType)来组装不同的OAuth2AuthorizationRequest

3. OAuth2AuthorizationRequest

接下来就是OAuth2.0协议的核心重中之重了,可能以后你定制化的参考就来自这里,这是圈起来要考的知识点。我会对OAuth2AuthorizationRequestResolver在各种授权方式下的OAuth2AuthorizationRequest对象的解析进行一个完全的总结归纳。大致分为以下两部分:

3.1 由AuthorizationGrantType决定的

在不同AuthorizationGrantType下对OAuth2AuthorizationRequest的梳理。涉及到的成员变量有:

  • authorizationGrantType ,来自配置spring.security.client.registration.{registrationId}.authorizationGrantType
  • responseType , 由authorizationGrantType 的值决定,参考下面的JSON。
  • additionalParameters,当authorizationGrantType值为authorization_code时需要额外的一些参数,参考下面JSON 。
  • attributes,不同的authorizationGrantType存在不同的属性。

其中类似{registrationId} 的形式表示 {registrationId}是一个变量,例如 registrationId=gitee

在OAuth2客户端配置spring.security.client.registration.{registrationId}的前缀中有以下五种情况。

scope 不包含openid而且client-authentication-method不为none时上述四个参数:

{ "authorizationGrantType": "authorization_code", "responseType": "code", "additionalParameters": {}, "attributes": { "registration_id": "{registrationId}" }}

scope 包含openid而且client-authentication-method不为none时上述四个参数:

{ "authorizationGrantType": "authorization_code", "responseType": "code", "additionalParameters": { "nonce": "{nonce}的Hash值" }, "attributes": { "registration_id": "{registrationId}", "nonce": "{nonce}" }}

scope不包含openid而且client-authentication-methodnone时上述四个参数:

{ "authorizationGra.........

版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4712145

Scroll to Top