本文主要以客户端认证模式(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();
|
类图

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请求。