Я не могу понять, как использовать тосо два вместе. После аутентификации пользователя у меня есть OAuth2AuthorizedClient в контексте, который я могу использовать как:
String clientRegistrationId = auth.getAuthorizedClientRegistrationId();
OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(clientRegistrationId, auth.getName());
accessToken = client.getAccessToken().getTokenValue();
Так что я могу использовать accessToken в моем приложении. Но это ручной перехватчик, который я вставляю в RestTemplate. Кроме того, если я делаю так, то мне приходится обрабатывать всю логику refreshToken другим перехватчиком. Вот тогда прибывает OAuth2RestTemplate, он обрабатывает все accessToken, refresToken вещи, которые мне не нужны перехватчики. Но чтобы использовать его, мне нужен OAuth2ProtectedResourceDetails:
public OAuth2RestTemplate(OAuth2ProtectedResourceDetails resource) {
this(resource, new DefaultOAuth2ClientContext());
}
, чего я не делаю, если использую стиль spring.security.oauth2.client.registration. Потому что AuthorizationCodeResourceDetails создается только в том случае, если используется стиль security.oauth2.client .:
spring:
thymeleaf:
cache: false
security:
oauth2:
client:
registration:
example-authorization-code:
id: demo-webapp-oidc-code
client-id: demo-webapp-oidc-code
client-secret: secret
client-name: demo-webapp-oidc-code
provider: authServer
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
authorization-grant-type: authorization_code
client-authentication-method: post
scope: openid, address
provider:
authServer:
token-uri: http://localhost:8095/authServer/oidc/token
authorization-uri: http://localhost:8095/authServer/oidc/authorize
user-info-uri: http://localhost:8095/authServer/oidc/profile
jwk-set-uri: http://localhost:8095/authServer/oidc/jwks
user-name-attribute: id
Вот как он принимает:
@Bean
@ConfigurationProperties(prefix = "security.oauth2.client")
@Primary
public AuthorizationCodeResourceDetails oauth2RemoteResource() {
return new AuthorizationCodeResourceDetails();
}
Я могу создать его вручную, но все становится сложнее. Давайте представим, что я каким-то образом создал resourceDetails, а затем создаю OAuth2RestTemplate с изменением цвета,
new OAuth2RestTemplate( resourceDetails, defaultOAuth2ClientContext);
, что означает, что мне нужно установить новый DefaultOAuth2ClientContext:
public DefaultOAuth2ClientContext(OAuth2AccessToken accessToken) {
this.accessToken = accessToken;
this.accessTokenRequest = new DefaultAccessTokenRequest();
}
, для которого требуется Oauth2AccessToken. Но у меня core.OAuth2AccessToken в моем контексте (OAuth2AuthorizedClient authorizedClient.getAccessToken), в то время как для него требуется common.OAuth2AccessToken.