Если вы не в контексте веб-интерфейса, вам нужно взглянуть на уровень сервиса.
Из Javadocs Spring Security для AuthorizedClientServiceOAuth2AuthorizedClientManager
:
Реализация {@link OAuth2AuthorizedClientManager}, способная работать вне контекста {@code HttpServletRequest}, например, в запланированный / фоновый поток и / или на уровне обслуживания.
Вот определение @Bean
, которое может помочь, которое я объясню ниже:
@Bean
OAuth2AuthorizedClientManager authorizedClientManager
(ClientRegistrationRepository clients) {
OAuth2AuthorizedClientService service =
new InMemoryOAuth2AuthorizedClientService(clients);
AuthorizedClientServiceOAuth2AuthorizedClientManager manager =
new AuthorizedClientServiceOAuth2AuthorizedClientManager(clients, service);
OAuth2AuthorizedClientProvider authorizedClientProvider =
OAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials()
.build();
manager.setAuthorizedClientProvider(authorizedClientProvider);
return manager;
}
An OAuth2AuthorizedClientManager
управляет авторизацией определений клиента OAuth 2.0. Эти определения хранятся в ClientRegistrationRepository
, и Spring Boot создает экземпляр по умолчанию ClientRegistrationRepository
через свойства, которые вы уже определили.
Для менеджера обычно необходимы две функции:
Первым является OAuth2AuthorizedClientService
, что удобно, если вы хотите хранить токены в базе данных - в Spring Security 5.2 единственная реализация - это встроенная в память; однако, похоже, что 5.3 будет поставляться с реализацией JDB C .
Вторым является OAuth2AuthorizedClientProvider
, который фактически выполняет запросы токена Как учетные данные клиента, который вы хотите сделать.
Создав этот менеджер, вы можете подключить его к своему веб-клиенту:
@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
new ServletOAuth2AuthorizedClientExchangeFilterFunction
(authorizedClientManager);
oauth2.setDefaultClientRegistrationId("auth1");
return WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build();
}
Использованная выше функция фильтра обмена - это то, что добавляет токен носителя к заголовок Authorization
. Он звонит менеджеру, чтобы спросить его о токене, менеджер извлекает его из службы. Если срок его действия истек, менеджер просит поставщика обновить его sh. Теперь с токеном fre sh менеджер возвращает его обратно в фильтр, чтобы добавить его в запрос.