In Anbetracht des folgende Code ist es möglich, ein Client-Credentials gesichert API in einer Anwendung Läufer zu nennen?
@Bean
public ApplicationRunner test(
WebClient.Builder builder,
ClientRegistrationRepository clientRegistrationRepo,
OAuth2AuthorizedClientRepository authorizedClient) {
return args -> {
try {
var oauth2 =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(
clientRegistrationRepo,
authorizedClient);
oauth2.setDefaultClientRegistrationId("test");
var response = builder
.apply(oauth2.oauth2Configuration())
.build()
.get()
.uri("test")
.retrieve()
.bodyToMono(String.class)
.block();
log.info("Response - {}", response);
} catch (Exception e) {
log.error("Failed to call test.", e);
}
};
}
Der Code schlägt fehl, weil,
java.lang.IllegalArgumentException: request cannot be null
Voller Stapel,
java.lang.IllegalArgumentException: request cannot be null
at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizedClientRepository.loadAuthorizedClient(HttpSessionOAuth2AuthorizedClientRepository.java:47) ~[spring-security-oauth2-client-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction.populateDefaultOAuth2AuthorizedClient(ServletOAuth2AuthorizedClientExchangeFilterFunction.java:364) ~[spring-security-oauth2-client-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction.lambda$null$2(ServletOAuth2AuthorizedClientExchangeFilterFunction.java:209) ~[spring-security-oauth2-client-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.attributes(DefaultWebClient.java:234) ~[spring-webflux-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.web.reactive.function.client.DefaultWebClient$DefaultRequestBodyUriSpec.attributes(DefaultWebClient.java:153) ~[spring-webflux-5.1.5.RELEASE.jar:5.1.5.RELEASE]
Mit der fehlerhaften Methode suchen, wie,
public <T extends OAuth2AuthorizedClient> T loadAuthorizedClient(
String clientRegistrationId, Authentication principal, HttpServletRequest request){
Assert.hasText(clientRegistrationId, "clientRegistrationId cannot be empty");
Assert.notNull(request, "request cannot be null");
return (OAuth2AuthorizedClient)this
.getAuthorizedClients(request)
.get(clientRegistrationId);
}
Das macht Sinn , da es nicht der Fall HttpServletRequest
für sie zu verwenden , seine bei der Inbetriebnahme der Anwendung aufgerufen wird.
Gibt es einen Workarounds andere als mache meine eigenen no-op OAuth2AuthorizedClientRepository
?
//Bearbeiten,
Dies ist nicht ein vollständig reaktiven Stapel. Es ist ein Spring Web-Stack mit dem WebClient mit darin verwendet wird.
Ich bin mir sehr wohl bewusst , die ServerOAuth2AuthorizedClientExchangeFilterFunction
etwas zu einem vollständig reaktiven Stapel gilt und erfordert ReactiveClientRegistrationRepository
und ReactiveOauth2AuthorizedClient
die nicht aufgrund dieses Wesens in einer Anwendung zur Verfügung gebaut oben auf Servlet - Stack, nicht reaktiv.
Da ich auch über dieses Problem gestolpert werde ich ein bisschen auf auszuarbeiten Darren Forsythes aktualisiert Antwort , um es für andere leichter zu finden:
Die von dem OP vorgelegt ergab eine Implementierung OAuth2AuthorizedClientManager
in der Lage ist
Betrieb außerhalb eines HttpServletRequest Kontextes, zum Beispiel in einem geplanten / Hintergrund-Thread und / oder in dem Dienst-Tiere
( Von den offiziellen Dokumenten )
Sagte Implementierung, die AuthorizedClientServiceOAuth2AuthorizedClientManager
ist, auf die übergebenen ServletOAuth2AuthorizedClientExchangeFilterFunction
den Standard zu ersetzen.
In meinem Beispiel sieht das etwa so aus:
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
ClientRegistrationRepository clientRegistrationRepository,
OAuth2AuthorizedClientService clientService)
{
OAuth2AuthorizedClientProvider authorizedClientProvider =
OAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials()
.build();
AuthorizedClientServiceOAuth2AuthorizedClientManager authorizedClientManager =
new AuthorizedClientServiceOAuth2AuthorizedClientManager(
clientRegistrationRepository, clientService);
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
return authorizedClientManager;
}
@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager)
{
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(
authorizedClientManager);
oauth2.setDefaultClientRegistrationId("keycloak");
return WebClient.builder().apply(oauth2.oauth2Configuration()).build();
}
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen