关于java:Spring-Security-实战干货OAuth2登录获取Token的核心逻辑

30次阅读

共计 2898 个字符,预计需要花费 8 分钟才能阅读完成。

1. 前言

在上一篇 Spring Security 实战干货:OAuth2 受权回调的外围认证流程中,咱们讲了当第三方批准受权后会调用 redirectUri 发送回执给咱们的服务器。咱们的服务器拿到一个两头授信凭据会再次进行认证,目标是为了获取 Token。而这个逻辑由OAuth2LoginAuthenticationProvider 负责,通过上一文的剖析后咱们发现获取 Token 的具体逻辑由 OAuth2AuthorizationCodeAuthenticationProvider 来实现,明天就把它的流程搞清楚,来看看 Spring Security OAuth2 认证受权获取Token 的具体步骤。

留神:本 Spring Security 干货系列教程的 OAuth2 相干局部是在 Spring Security 5.x 版本的。

2. OAuth2AuthorizationCodeAuthenticationProvider

该类是 AuthenticationProvider 针对 OAuth 2.0Authorization Code Grant模式的实现。对于 AuthenticationProvider 有必要简略强调一下,它曾经屡次在 Spring Security 干货系列中呈现,非常重要!肯定要去看看相干的剖析和应用,它是你依据业务扩大认证形式渠道的重要入口。

2.1 OAuth2AccessTokenResponseClient

在该实现中蕴含了一个 OAuth2AccessTokenResponseClient 成员变量,它形象了通过 tokenUri 端点从认证服务器获取 Token 的细节。你能够依据 OAuth 2.0 罕用的四种模式来进行实现它,以达到依据不同的策略来获取 Token 的能力。

Spring Security 5OAuth 2.0登录的配置中默认应用 DefaultAuthorizationCodeTokenResponseClient。如果你想应用自定义实现的话能够通过HttpSecurity 来配置:

        @Override
        protected void configure(HttpSecurity http) throws Exception {http.oauth2Login()
                    .tokenEndpoint()
                // 注入自定义的 OAuth2AccessTokenResponseClient
                    .accessTokenResponseClient(authorizationCodeTokenResponseClient);
            // 其它省略

        }

接下来咱们看看 DefaultAuthorizationCodeTokenResponseClient 实现的获取 Token 的逻辑:

@Override
public OAuth2AccessTokenResponse getTokenResponse(OAuth2AuthorizationCodeGrantRequest authorizationCodeGrantRequest) {Assert.notNull(authorizationCodeGrantRequest, "authorizationCodeGrantRequest cannot be null");
// 1. 封装调用 tokenUri 所须要的申请参数 RequestEntity
   RequestEntity<?> request = this.requestEntityConverter.convert(authorizationCodeGrantRequest);

   ResponseEntity<OAuth2AccessTokenResponse> response;
   try {
   // 2. 通过 RestTemplate 发动申请获取 OAuth2AccessTokenResponse
      response = this.restOperations.exchange(request, OAuth2AccessTokenResponse.class);
   } catch (RestClientException ex) {
      OAuth2Error oauth2Error = new OAuth2Error(INVALID_TOKEN_RESPONSE_ERROR_CODE,
            "An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response:" + ex.getMessage(), null);
      throw new OAuth2AuthorizationException(oauth2Error, ex);
   }

  // 3. 解析 ResponseEntity 组织返回值 OAuth2AccessTokenResponse
   OAuth2AccessTokenResponse tokenResponse = response.getBody();

   if (CollectionUtils.isEmpty(tokenResponse.getAccessToken().getScopes())) {
  
      // originally requested by the client in the Token Request
      tokenResponse = OAuth2AccessTokenResponse.withResponse(tokenResponse)
            .scopes(authorizationCodeGrantRequest.getClientRegistration().getScopes())
            .build();}

   return tokenResponse;
}

这里的形式跟我另一个开源我的项目 Payment Spring Boot 的申请形式殊途同归,都是三个步骤:

  1. 组织参数RequestEntity
  2. RestOperations发动申请。
  3. 解析 ResponseEntity 组织返回值。

如果有些的 OAuth 2.0 认证服务器获取 Token 的形式比拟非凡你能够自行实现OAuth2AccessTokenResponseClient

3. 总结

OAuth2AccessTokenResponseClientOAuth2AuthorizationCodeAuthenticationProvider 的外围要点。搞清楚它的作用和机制就能够了。这里咱们总结一下 OAuth2AuthorizationCodeAuthenticationProvider 的认证过程:

  1. 检测未授信 OAuth2AuthorizationCodeAuthenticationToken 的状态是否非法。
  2. 通过 OAuth2AccessTokenResponseClient 申请 OAuth 2.0 认证服务器获取 Token 等信息。
  3. 组装认证过的授信 OAuth2AuthorizationCodeAuthenticationToken 返回。

到此 OAuth 2.0 的登录流程就搞清楚了,读者可通过系列文章进行学习批评。我是:码农小胖哥,多多关注,获取实用的编程干货。

关注公众号:Felordcn 获取更多资讯

集体博客:https://felord.cn

正文完
 0