Spring Security 6.5: Gebruik 'n proxy vir die OAuth-magtigingskode-uitruiling
Gee Spring Security se magtigingskode-tokenresponskliënt 'n proxy-bewuste RestClient terwyl sy OAuth-omsetters en fouthanteerder behou word.
Die blaaier bereik die identiteitsverskaffer, en dan misluk die aanmelding wanneer die toepassing die teruggekeerde magtigingskode uitruil. Daardie uitruiling is 'n uitgaande versoek van die toepassingbediener, met sy eie HTTP-kliënt.
Vir die RestClient-gebaseerde API wat in Spring Security 6.5 beskikbaar is, voorsien 'n proxy-bewuste versoekfabriek aan die magtigingskode-tokenresponskliënt:
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 omsetter- en fouthanteerderklasse behou Spring Security se gedokumenteerde tokenversoekgedrag. 'n Generiese RestClient wat slegs vir 'n onverwante JSON-API opgestel is, is nie 'n gelykwaardige vervanging nie.
Koppel dieselfde tokenClient aan die bestaande sekuriteitskonfigurasie:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
Dit is konfigurasiefragmente vir 'n toepassing wat reeds sy kliëntregistrasie en SecurityFilterChain het. Hulle kies 'n HTTP-proxy sonder verifikasie; 'n proxy wat geloofsbriewe vereis, benodig die gekose vervoer se ooreenstemmende verifikasiekonfigurasie. Vir 'n publiek bereikbare HTTPS-token-eindpunt op 'n toegelate publieke roete kan 'n HTTP-inskrywing uit die HTTP-proxylys daardie proxy-adres sonder rekening vul.
Hou die proxy-gasheer apart van sy poort en URL-skema. Laat die identiteitsverskaffer se token-URI as die bestemming. Die voorbeeld vervang nie sertifikaatvalidering nie.
Latere versoeke het hul eie eienaarskapkontrole nodig. UserInfo-verkryging, hernuwingstoken-uitruilings, client-credentials-toekennings en beskermde API-oproepe kan ander kliëntobjekte gebruik. Stel die ooreenstemmende ondersteunde kliënt op wanneer daardie bewerking ook die roete nodig het. Vir Spring Security 6.5 se reaktiewe client_credentials-vloei, stel die reaktiewe tokenkliënt en sy toekenningsverskaffer afsonderlik op.
Legacy-voorbeelde wat OAuth2RestTemplate en AccessTokenProvider gebruik, behoort aan die ouer Spring Security OAuth-projek. Kies die API wat die geïnstalleerde toepassing gebruik voordat jy kode aanpas; moenie daardie objekte in hierdie konfigurasie meng nie.