Короче говоря, оно запрашивает область, затем запрашивает токен, используя учетные данные клиента (client_id, client_secret), затем запрашивает новый токен ( grant_type:token-exchange).
И у меня есть приложение Spring, которое пытается пройти аутентификацию в приложении, использующем KeyCloak. Я пытаюсь использовать Spring Security, но я очень новичок в этом, и Token Exchange, похоже, также является новым механизмом аутентификации.
До сих пор я пробовал в своем приложении следующее. yml:
Код: Выделить всё
spring:
main:
web-application-type: reactive
security:
oauth2:
client:
registration:
myClient:
client-id: ${CLIENT_ID}
client-secret: ${CLIENT_SECRET}
client-authentication-method: client_secret_post
authorization-grant-type: urn:ietf:params:oauth:grant-type:token-exchange
provider:
myClient:
token-uri: ${TOKEN_URI}
Код: Выделить всё
@Bean
public WebClient buildOAuthWebClient(HttpClient httpClient,
ExchangeStrategies strategies,
ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
LOGGER.info("Using OAuth mode");
ServerOAuth2AuthorizedClientExchangeFilterFunction oath2ClientFilter =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
oath2ClientFilter.setDefaultClientRegistrationId("myClient");
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.exchangeStrategies(strategies)
.filter(oath2ClientFilter)
.build();
}
@Bean
public ReactiveOAuth2AuthorizedClientManager authorizedClientManager(ReactiveClientRegistrationRepository clientRegistrationRepository,
ServerOAuth2AuthorizedClientRepository authorizedClientRepository) {
TokenExchangeReactiveOAuth2AuthorizedClientProvider tokenExchangeAuthorizedClientProvider =
new TokenExchangeReactiveOAuth2AuthorizedClientProvider();
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider =
ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
.provider(tokenExchangeAuthorizedClientProvider)
.clientCredentials()
.refreshToken()
.build();
DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager =
new DefaultReactiveOAuth2AuthorizedClientManager(
clientRegistrationRepository, authorizedClientRepository);
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
return authorizedClientManager;
}
@Bean
public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
http.csrf(ServerHttpSecurity.CsrfSpec::disable).oauth2Client(Customizer.withDefaults());
return http.build();
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... entication
Мобильная версия