Spring Security 6.5: обмен кода авторизации OAuth через прокси
Передайте клиенту ответа с токеном кода авторизации в Spring Security RestClient с поддержкой прокси, сохранив его конвертеры OAuth и обработчик ошибок.
Браузер доходит до поставщика идентичности, а затем вход не удаётся, когда приложение обменивает возвращённый код авторизации. Этот обмен — исходящий запрос с сервера приложения, со своим 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, который использует установленное приложение, прежде чем адаптировать код; не смешивайте эти объекты в данной конфигурации.