Как использовать OAuth2RestTemplate с потоком кода авторизации Spring - PullRequest
0 голосов
/ 04 ноября 2019

Я не могу понять, как использовать тосо два вместе. После аутентификации пользователя у меня есть 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.

...