Spring Security 6.5: proksiranje razmjene OAuth autorizacijskog koda
Dajte klijentu odgovora na token autorizacijskog koda u Spring Securityju RestClient svjestan proxyja, zadržavajući OAuth konvertere i rukovalac greškama.
Preglednik stigne do davatelja identiteta, a zatim prijava ne uspije kada aplikacija razmijeni vraćeni autorizacijski kod. Ta razmjena je odlazni zahtjev s poslužitelja aplikacije, sa vlastitim HTTP klijentom.
Za API zasnovan na RestClientu dostupan u Spring Securityju 6.5, dostavite tvornicu zahtjeva svjesnu proxyja klijentu odgovora na token autorizacijskog koda:
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);
Klase konvertera i rukovaoca greškama čuvaju dokumentirano ponašanje zahtjeva za token u Spring Securityju. Generički RestClient konfiguriran samo za nepovezani JSON API nije ekvivalentna zamjena.
Povežite isti tokenClient s postojećom sigurnosnom konfiguracijom:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
Ovo su fragmenti konfiguracije za aplikaciju koja već ima registraciju klijenta i SecurityFilterChain. Oni biraju HTTP proxy bez autentifikacije; proxy koji zahtijeva vjerodajnice treba odgovarajuću konfiguraciju autentifikacije odabranog prijenosa. Za javno dostupnu HTTPS krajnju točku tokena na dopuštenoj javnoj ruti, HTTP unos s popisa HTTP proxyja može popuniti tu adresu proxyja bez računa.
Držite host proxyja odvojeno od njegovih vrata i URL sheme. Ostavite URI tokena davatelja identiteta kao odredište. Primjer ne zamjenjuje provjeru certifikata.
Kasniji zahtjevi trebaju vlastitu provjeru vlasništva. Dohvaćanje UserInfo, razmjene tokena za osvježavanje, dodjele client-credentials i pozivi zaštićenog API-ja mogu koristiti druge klijentske objekte. Konfigurirajte odgovarajući podržani klijent kada ta operacija također treba rutu. Za reaktivni tok client_credentials u Spring Securityju 6.5 konfigurirajte reaktivni klijent tokena i njegovog davatelja dodjele odvojeno.
Stari primjeri s OAuth2RestTemplate i AccessTokenProvider pripadaju starijem projektu Spring Security OAuth. Odaberite API koji koristi instalirana aplikacija prije prilagodbe koda; ne miješajte te objekte u ovu konfiguraciju.