Браузер доходит до поставщика идентичности, а затем вход не удаётся, когда приложение обменивает возвращённый код авторизации. Этот обмен — исходящий запрос с сервера приложения, со своим HTTP-клиентом.

Для API на основе RestClient, доступного в Spring Security 6.5, передайте клиенту ответа с токеном кода авторизации фабрику запросов с поддержкой прокси:

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);

Классы конвертера и обработчика ошибок сохраняют документированное поведение запроса токена в Spring Security. Обычный RestClient, настроенный только для несвязанного JSON API, не является равноценной заменой.

Подключите тот же tokenClient к существующей конфигурации безопасности:

http.oauth2Login(login -> login
    .tokenEndpoint(token -> token
        .accessTokenResponseClient(tokenClient)));

Это фрагменты конфигурации для приложения, у которого уже есть регистрация клиента и SecurityFilterChain. Они выбирают HTTP-прокси без аутентификации; прокси, требующему учётных данных, нужна соответствующая конфигурация аутентификации выбранного транспорта. Для общедоступной конечной точки токена HTTPS на разрешённом публичном маршруте HTTP-запись из списка HTTP-прокси может заполнить этот адрес прокси без учётной записи.

Держите хост прокси отдельно от его порта и схемы URL. Оставьте URI токена поставщика идентичности в качестве назначения. Пример не заменяет проверку сертификатов.

Последующим запросам нужна собственная проверка владения. Получение UserInfo, обмены токена обновления, предоставления client-credentials и вызовы защищённого API могут использовать другие клиентские объекты. Настройте соответствующий поддерживаемый клиент, когда эта операция тоже требует маршрута. Для реактивного потока client_credentials в Spring Security 6.5 настройте реактивный клиент токена и его поставщик предоставлений отдельно.

Старые примеры с OAuth2RestTemplate и AccessTokenProvider относятся к более старому проекту Spring Security OAuth. Выберите API, который использует установленное приложение, прежде чем адаптировать код; не смешивайте эти объекты в данной конфигурации.

Похожие статьи