Spring Security 6.5: Den OAuth-Autorisierungscode-Austausch über einen Proxy leiten
Geben Sie dem Token-Antwort-Client für den Autorisierungscode von Spring Security einen proxyfähigen RestClient, während dessen OAuth-Konverter und Fehlerbehandlung erhalten bleiben.
Der Browser erreicht den Identitätsanbieter, dann schlägt die Anmeldung fehl, wenn die Anwendung den zurückgegebenen Autorisierungscode austauscht. Dieser Austausch ist eine ausgehende Anfrage des Anwendungsservers mit einem eigenen HTTP-Client.
Für die in Spring Security 6.5 verfügbare RestClient-basierte API statten Sie den Token-Antwort-Client für den Autorisierungscode mit einer proxyfähigen Anfrage-Factory aus:
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
java.net.Proxy.Type.HTTP,
new java.net.InetSocketAddress("proxy.example", 8080)));
factory.setConnectTimeout(5000);
factory.setReadTimeout(15000);
RestClient tokenHttp = RestClient.builder()
.requestFactory(factory)
.messageConverters(converters -> {
converters.clear();
converters.add(new FormHttpMessageConverter());
converters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
})
.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
.build();
RestClientAuthorizationCodeTokenResponseClient tokenClient =
new RestClientAuthorizationCodeTokenResponseClient();
tokenClient.setRestClient(tokenHttp);
Die Konverter- und Fehlerbehandlungsklassen bewahren das dokumentierte Token-Anfrageverhalten von Spring Security. Ein generischer RestClient, der nur für eine unabhängige JSON-API konfiguriert ist, ist kein gleichwertiger Ersatz.
Verdrahten Sie denselben tokenClient in die bestehende Sicherheitskonfiguration:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
Dies sind Konfigurationsfragmente für eine Anwendung, die bereits ihre Client-Registrierung und SecurityFilterChain besitzt. Sie wählen einen HTTP-Proxy ohne Authentifizierung; ein Proxy, der Anmeldedaten verlangt, benötigt die passende Authentifizierungskonfiguration des gewählten Transports. Für einen öffentlich erreichbaren HTTPS-Token-Endpunkt auf einer zulässigen öffentlichen Route kann ein HTTP-Eintrag aus der HTTP-Proxy-Liste diese Proxy-Adresse ohne Konto füllen.
Halten Sie den Proxy-Host von seinem Port und URL-Schema getrennt. Lassen Sie die Token-URI des Identitätsanbieters das Ziel. Das Beispiel ersetzt nicht die Zertifikatsprüfung.
Spätere Anfragen benötigen eine eigene Eigentumsprüfung. UserInfo-Abruf, Refresh-Token-Austausche, client-credentials-Grants und geschützte API-Aufrufe können andere Client-Objekte verwenden. Konfigurieren Sie den entsprechenden unterstützten Client, wenn dieser Vorgang ebenfalls die Route benötigt. Für den reaktiven client_credentials-Flow von Spring Security 6.5 konfigurieren Sie den reaktiven Token-Client und seinen Grant-Provider separat.
Ältere Beispiele mit OAuth2RestTemplate und AccessTokenProvider gehören zum älteren Spring Security OAuth-Projekt. Wählen Sie die API, die die installierte Anwendung verwendet, bevor Sie Code anpassen; mischen Sie diese Objekte nicht in diese Konfiguration.