Spring Security 6.5: usar un proxy para el intercambio del código de autorización OAuth
Proporcione al cliente de respuesta de token del código de autorización de Spring Security un RestClient consciente del proxy, conservando sus convertidores OAuth y su gestor de errores.
El navegador llega al proveedor de identidad y luego el inicio de sesión falla cuando la aplicación intercambia el código de autorización devuelto. Ese intercambio es una solicitud saliente del servidor de la aplicación, con su propio cliente HTTP.
Para la API basada en RestClient disponible en Spring Security 6.5, proporcione una fábrica de solicitudes consciente del proxy al cliente de respuesta de token del código de autorización:
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);
Las clases de convertidor y de gestor de errores conservan el comportamiento documentado de solicitud de token de Spring Security. Un RestClient genérico configurado solo para una API JSON no relacionada no es una sustitución equivalente.
Conecte ese mismo tokenClient en la configuración de seguridad existente:
http.oauth2Login(login -> login
.tokenEndpoint(token -> token
.accessTokenResponseClient(tokenClient)));
Estos son fragmentos de configuración para una aplicación que ya tiene su registro de cliente y su SecurityFilterChain. Seleccionan un proxy HTTP sin autenticación; un proxy que requiere credenciales necesita la configuración de autenticación correspondiente del transporte elegido. Para un punto de conexión de token HTTPS accesible públicamente en una ruta pública permitida, una entrada HTTP de la lista de proxies HTTP puede completar esa dirección de proxy sin cuenta.
Mantenga el host del proxy separado de su puerto y de su esquema de URL. Deje el URI del token del proveedor de identidad como destino. El ejemplo no sustituye la validación de certificados.
Las solicitudes posteriores necesitan su propia comprobación de propiedad. La obtención de UserInfo, los intercambios de token de actualización, las concesiones client-credentials y las llamadas a API protegidas pueden usar otros objetos de cliente. Configure el cliente compatible correspondiente cuando esa operación también necesite la ruta. Para el flujo reactivo client_credentials de Spring Security 6.5, configure el cliente de token reactivo y su proveedor de concesiones por separado.
Los ejemplos heredados que usan OAuth2RestTemplate y AccessTokenProvider pertenecen al proyecto Spring Security OAuth anterior. Elija la API que usa la aplicación instalada antes de adaptar el código; no mezcle esos objetos en esta configuración.