Spring Security 5 Aufruf OAuth2 Gesicherte API in Anwendung Runner führt in Illegal

Darren Forsythe:

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 HttpServletRequestfü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 ServerOAuth2AuthorizedClientExchangeFilterFunctionetwas zu einem vollständig reaktiven Stapel gilt und erfordert ReactiveClientRegistrationRepositoryund ReactiveOauth2AuthorizedClientdie nicht aufgrund dieses Wesens in einer Anwendung zur Verfügung gebaut oben auf Servlet - Stack, nicht reaktiv.

Scorpioo590:

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 OAuth2AuthorizedClientManagerin 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 AuthorizedClientServiceOAuth2AuthorizedClientManagerist, auf die übergebenen ServletOAuth2AuthorizedClientExchangeFilterFunctionden 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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Spring Security OAuth2 und FormLogin in einer einzigen Anwendung

Spring Security oauth2 Login und Ressourcenserver in derselben Anwendung

Spring Security oauth2 - Filter nach oauth / Token-Aufruf hinzufügen

Spring Boot Junit testet gesicherte Anwendung

Zugriff auf OAuth-gesicherte API über Spring Batch

Spring Security 5-Restclient mit OAuth2

Spring Security Oauth2 für Spring Website

Wie aktualisiert OAuth2 Token mit Spring Security 5 OAuth2 Client und RestTemplate

Wie verwende ich Spring Security 5 und OAuth2 Client, um Aktualisierungstoken abzurufen und API-Aufrufe durchzuführen?

Kann ich einen API-Aufruf verwenden, um mich bei einer anderen Anwendung mit Spring Security zu authentifizieren?

Der Rest-Api-Aufruf gibt den Fehler 400 mit Spring Oauth2 aus

Spring Security 5 Ersatz für OAuth2RestTemplate

So erhalten Sie oauth2-Zugriffstoken in einer Spring-Boot-Anwendung (keine Webanwendung) mithilfe von Spring Security 5

Spring Security OAuth2 v5: NoSuchBeanDefinitionException: 'org.springframework.security.oauth2.jwt.JwtDecoder'

Migration von Spring Boot Oauth2 zu Spring Security 5

Wie kann ich mit Spring Cloud Security Oauth2 mehrere Oauth2-SSO-Server in einer einzelnen Spring-Boot-Anwendung verwenden?

Benutzerklasse für Spring Security-Anwendung

Spring Security OAuth2: Unzureichende Authentifizierungsausnahme

Oauth2 Spring Security-Autorisierungscode

Spring Security OAuth2 reiner Ressourcenserver

Aktualisieren von Spring Security OAuth2

Microservices und Spring Security OAuth2

Spring Security WebSecurityConfig benötigt gesicherte und ungesicherte Zonen

SpringBoot 2.0 : Sichern einer REST-API mit Spring Security Oauth2

Sichern der REST-API mit Spring-security @PreAuthorize Annotation und OAuth2

Java Spring Security: 401 Unauthorized für Token OAuth2 Endpunkt

Web- und Mobile-Clients für Spring Security OAuth2

Spring Security OAuth2: Wie stelle ich zwei separate Anmeldelinks für zwei Benutzertypen bereit?

Spring Security OAuth2: Wie füge ich mehrere Sicherheitsfilterketten vom Typ ResourceServerConfigurer hinzu?

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv