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.

Powiązane artykuły