本文主要以客户端认证模式(client_credentials)作为样例实现学习,其它认证模式类似。

RestTemplate接口

1
2
3
4
5
6
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "client_credentials");
params.add("client_id", "your_client_id");
params.add("client_secret", "your_client_secret");
String result = new RestTemplate().postForObject(oauth2ClientProperties.getAccessTokenUrl(), params, String.class);
String accessToken = JSON.parseObject(result).getString("access_token");

OAuth2RestTemplate接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Bean("clientCredentialsResourceDetails")
public ClientCredentialsResourceDetails resourceDetails() {
    ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
    //http://localhost:${server.port}/oauth/token
    details.setAccessTokenUri("your_access_token_uri");
    details.setClientId("your_client_id");
    details.setClientSecret("your_client_secret");
    details.setAuthenticationScheme(AuthenticationScheme.header);
    return details;
}

@Bean("oAuth2RestTemplate")
public OAuth2RestTemplate oAuth2RestTemplate() {
    final OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resourceDetails(), new DefaultOAuth2ClientContext());
    //default: SimpleClientHttpRequestFactory
    oAuth2RestTemplate.setRequestFactory(new Netty4ClientHttpRequestFactory());
    return oAuth2RestTemplate;

}

OAuth2RestTemplate oAuth2RestTemplate = oAuth2RestTemplate();
String accessToken = oAuth2RestTemplate.getAccessToken().toString();

类图

OAuth2RestTemplate

AccessTokenProvider接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
@Bean("clientCredentialsResourceDetails")
public ClientCredentialsResourceDetails resourceDetails() {
    ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
    //http://localhost:${server.port}/oauth/token
    details.setAccessTokenUri("your_access_token_uri");
    details.setClientId("your_client_id");
    details.setClientSecret("your_client_secret");
    details.setAuthenticationScheme(AuthenticationScheme.header);
    return details;
}

ClientCredentialsResourceDetails clientCredentials = resourceDetails();
        ClientCredentialsAccessTokenProvider provider = new ClientCredentialsAccessTokenProvider();
        OAuth2AccessToken oAuth2AccessToken = null;
        try {
            oAuth2AccessToken = provider.obtainAccessToken(clientCredentials, new DefaultAccessTokenRequest());
        } catch (Exception e) {
            e.printStackTrace();
            log.error("获取AccessToken失败, error: {}", e.getMessage());
        }
        String accessToken = oAuth2AccessToken.toString();

OAuth2ProtectedResourceDetails封装了相关请求数据,根据oauth2认证模式实现了相对应的实现类(ClientCredentialsResourceDetails、ResourceOwnerPasswordResourceDetails…)。OAuth2RestTemplate(继承RestTemplate)和AccessTokenProvider接口根据OAuth2ProtectedResourceDetails提供的信息,最终通过RestTemplate发送http请求。