У меня есть приложение Spring (не Boot), которое должно неинтерактивно (в запланированном задании) получать доступ к некоторым сторонним ресурсам от имени наших пользователей. Эти ресурсы используют OAuth 2.0 для авторизации. У нас уже есть рабочий процесс, который получает нам необходимые токены и получает доступ к ресурсам, используя Spring Social или нашу собственную реализацию, ни одна из которых не является оптимальной (Spring Social, кажется, не поддерживается, мы бы предпочли использовать библиотеку, чем поддерживать OAuth » рамки ").
Я пытаюсь использовать WebClient
из Spring Security 5.1, но я не уверен, что я использую его правильно.
WebClient
создается следующим образом:
final ClientRegistration 3rdParty = 3rdParty();
final ReactiveClientRegistrationRepository clientRegistrationRepository =
new InMemoryReactiveClientRegistrationRepository(3rdParty);
final ReactiveOAuth2AuthorizedClientService authorizedClientService =
new InMemoryReactiveOAuth2AuthorizedClientService(clientRegistrationRepository);
final ServerOAuth2AuthorizedClientRepository authorizedClientRepository =
new AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository(authorizedClientService);
final ServerOAuth2AuthorizedClientExchangeFilterFunction autorizedClientExchangeFilterFunction =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepository, authorizedClientRepository);
return WebClient.builder()
.filter(autorizedClientExchangeFilterFunction)
.build();
и доступ к ресурсу таким образом работает:
final OAuth2AuthorizedClient oAuth2AuthorizedClient = ... // (OAuth2AuthorizedClient with OAuth2AccessToken)
final Mono<SomeResource> someResourceMono = webClient().get()
.uri(3rdpartyUrl)
.attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.oauth2AuthorizedClient(oAuth2AuthorizedClient))
.retrieve()
.bodyToMono(SomeResource.class);
Проблема в том, что я не понимаю, как ReactiveClientRegistrationRepository
и ServerOAuth2AuthorizedClientRepository
используются в этом подходе. Если мне нужно создать полностью заполненный OAuth2AuthorizedClient
для доступа к ресурсу, зачем нужны эти репозитории?
Я ожидал, что мне нужно передать clientRegistrationId, некоторый "PrincipalName", реализовать наши ReactiveOAuth2AuthorizedClientService
загрузки OAuth2AuthorizedClient
с помощью "PrincipalName" и позволить ServerOAuth2AuthorizedClientRepository
делать свою работу, но я вижу только так Для передачи принципала в WebClient используется ServerOAuth2AuthorizedClientExchangeFilterFunction#oauth2AuthorizedClient
, для которого требуется полный OAuth2AuthorizedClient
. Какую часть я делаю неправильно?