Spring Security 6.5: przeprowadzenie wymiany kodu autoryzacji OAuth przez proxy
Daj klientowi odpowiedzi tokenu kodu autoryzacji w Spring Security RestClient świadomy proxy, zachowując jego konwertery OAuth i obsługę błędów.
Przeglądarka dociera do dostawcy tożsamości, a następnie logowanie kończy się niepowodzeniem, gdy aplikacja wymienia zwrócony kod autoryzacji. Ta wymiana to żądanie wychodzące z serwera aplikacji, z własnym klientem HTTP.
Dla API opartego na RestClient dostępnego w Spring Security 6.5 zapewnij klientowi odpowiedzi tokenu kodu autoryzacji fabrykę żądań świadomą proxy:
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);
Klasy konwertera i obsługi błędów zachowują udokumentowane zachowanie żądania tokenu w Spring Security. Ogólny RestClient skonfigurowany tylko dla niepowiązanego API JSON nie jest równoważnym zamiennikiem.
Podłącz ten sam tokenClient do istniejącej konfiguracji zabezpieczeń:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
To fragmenty konfiguracji dla aplikacji, która ma już rejestrację klienta i SecurityFilterChain. Wybierają proxy HTTP bez uwierzytelniania; proxy wymagające poświadczeń potrzebuje odpowiedniej konfiguracji uwierzytelniania wybranego transportu. Dla publicznie dostępnego punktu końcowego tokenu HTTPS na dozwolonej publicznej trasie wpis HTTP z listy proxy HTTP może wypełnić ten adres proxy bez konta.
Trzymaj host proxy oddzielnie od jego portu i schematu URL. Pozostaw URI tokenu dostawcy tożsamości jako cel. Przykład nie zastępuje walidacji certyfikatów.
Późniejsze żądania wymagają własnego sprawdzenia własności. Pobieranie UserInfo, wymiany tokenu odświeżania, nadania client-credentials i wywołania chronionego API mogą używać innych obiektów klienta. Skonfiguruj odpowiedniego obsługiwanego klienta, gdy ta operacja również wymaga trasy. Dla reaktywnego przepływu client_credentials w Spring Security 6.5 skonfiguruj reaktywnego klienta tokenu i jego dostawcę nadań osobno.
Starsze przykłady używające OAuth2RestTemplate i AccessTokenProvider należą do starszego projektu Spring Security OAuth. Wybierz API używane przez zainstalowaną aplikację przed dostosowaniem kodu; nie mieszaj tych obiektów do tej konfiguracji.