Spring Security 6.5: dirigera OAuth-auktoriseringskodutbytet via en proxy
Ge Spring Securitys tokenresponsklient för auktoriseringskoden en proxy medveten RestClient, samtidigt som OAuth-konverterarna och felhanteraren behålls.
Webbläsaren når identitetsleverantören, sedan misslyckas inloggningen när applikationen utbyter den returnerade auktoriseringskoden. Det utbytet är en utgående begäran från applikationsservern, med sin egen HTTP-klient.
För det RestClient-baserade API som är tillgängligt i Spring Security 6.5, ge tokenresponsklienten för auktoriseringskoden en proxy medveten begäransfabrik:
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);
Konverter- och felhanterarklasserna bevarar Spring Securitys dokumenterade tokenbegäransbeteende. En generisk RestClient som bara är konfigurerad för ett orelaterat JSON-API är inte en likvärdig ersättning.
Anslut samma tokenClient till den befintliga säkerhetskonfigurationen:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
Detta är konfigurationsfragment för en applikation som redan har sin klientregistrering och SecurityFilterChain. De väljer en HTTP-proxy utan autentisering; en proxy som kräver inloggningsuppgifter behöver den valda transportens motsvarande autentiseringskonfiguration. För en offentligt nåbar HTTPS-tokenändpunkt på en tillåten offentlig rutt kan en HTTP-post från HTTP-proxylistan fylla den proxyadressen utan konto.
Håll proxyvärden separat från dess port och URL-schema. Låt identitetsleverantörens token-URI vara destinationen. Exemplet ersätter inte certifikatvalidering.
Senare begäranden behöver sin egen ägarkontroll. Hämtning av UserInfo, utbyten av uppdateringstoken, client-credentials-tilldelningar och skyddade API-anrop kan använda andra klientobjekt. Konfigurera motsvarande klient som stöds när den åtgärden också behöver rutten. För Spring Security 6.5:s reaktiva client_credentials-flöde konfigurerar du den reaktiva tokenklienten och dess tilldelningsleverantör separat.
Äldre exempel med OAuth2RestTemplate och AccessTokenProvider tillhör det äldre Spring Security OAuth-projektet. Välj det API som den installerade applikationen använder innan du anpassar kod; blanda inte in dessa objekt i den här konfigurationen.