Spring Security 6.5: de OAuth-autorisatiecode-uitwisseling via een proxy laten verlopen
Geef de tokenresponsclient voor de autorisatiecode van Spring Security een proxybewuste RestClient, terwijl de OAuth-converters en de foutafhandeling behouden blijven.
De browser bereikt de identiteitsprovider, waarna de aanmelding mislukt wanneer de applicatie de teruggegeven autorisatiecode uitwisselt. Die uitwisseling is een uitgaand verzoek van de applicatieserver, met een eigen HTTP-client.
Voor de op RestClient gebaseerde API die beschikbaar is in Spring Security 6.5, voorziet u de tokenresponsclient voor de autorisatiecode van een proxybewuste verzoekfactory:
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);
De converter- en foutafhandelingsklassen behouden het gedocumenteerde tokenverzoekgedrag van Spring Security. Een generieke RestClient die alleen voor een niet-gerelateerde JSON-API is geconfigureerd, is geen gelijkwaardige vervanging.
Sluit dezelfde tokenClient aan op de bestaande beveiligingsconfiguratie:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
Dit zijn configuratiefragmenten voor een applicatie die al haar clientregistratie en SecurityFilterChain heeft. Ze selecteren een HTTP-proxy zonder authenticatie; een proxy die inloggegevens vereist, heeft de bijbehorende authenticatieconfiguratie van het gekozen transport nodig. Voor een openbaar bereikbaar HTTPS-token-eindpunt op een toegestane openbare route kan een HTTP-vermelding uit de HTTP-proxylijst dat proxyadres zonder account invullen.
Houd de proxyhost gescheiden van de poort en het URL-schema. Laat de token-URI van de identiteitsprovider de bestemming blijven. Het voorbeeld vervangt de certificaatvalidatie niet.
Latere verzoeken hebben hun eigen eigendomscontrole nodig. Het ophalen van UserInfo, uitwisselingen van vernieuwingstokens, client-credentials-toekenningen en beveiligde API-aanroepen kunnen andere clientobjecten gebruiken. Configureer de overeenkomstige ondersteunde client wanneer die bewerking ook de route nodig heeft. Voor de reactieve client_credentials-stroom van Spring Security 6.5 configureert u de reactieve tokenclient en de bijbehorende toekenningsprovider apart.
Oudere voorbeelden met OAuth2RestTemplate en AccessTokenProvider horen bij het oudere Spring Security OAuth-project. Kies de API die de geïnstalleerde applicatie gebruikt voordat u code aanpast; meng die objecten niet in deze configuratie.