java - yml - Spring OAuth Authorization Server detrás de Spring Cloud Zuul Proxy
zuul spring boot (2)
Actualmente estoy desarrollando una aplicación basada en una arquitectura de microservicio. Utilizamos una puerta de enlace API implementada utilizando el servidor Zuul de Spring Cloud Netfix para enrutar las solicitudes a nuestros microservicios.
Para realizar el inicio de sesión único para todos nuestros servicios, actualmente estoy trabajando en un servidor OAuth2 configurado con Spring Cloud Security. El servidor es básicamente solo copia y pasada de la implementación en Dave Syer''s Repo: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver
La principal diferencia es que quiero enrutar las solicitudes a mi servidor OAuth a través del Proxy Zuul. De esta manera no tendré que exponer directamente mi servidor OAuth y puedo agregar y eliminar el servidor de inicio de sesión dinámicamente.
El problema es que no logro entender cómo configurar correctamente esta configuración. Cuando intento acceder a un recurso protegido en el servidor de OAuth, se me reenvía a la página de inicio de sesión. Esto por supuesto es como se esperaba. Pero no puedo averiguar cómo configurar el nombre de host y el puerto utilizados al reenviar. Lo que quiero que suceda es que el servidor se reenvíe a un punto final en el servidor Zuul que se enviará por proxy al servidor OAuth. (La API Zuul Gateway debe ser el único servidor con el que el cliente habla. Todo lo demás estará oculto).
Como es el host y el puerto se leen desde HttpServletRequest
en LoginUrlAuthenticationEntryPoint
. Pero la solicitud que ve el servidor es la solicitud enviada por el proxy de Zuul. Así que me reenvío a una IP interna, no a un punto final en el proxy.
Intenté establecer la URL de la página de inicio de sesión en WebSecurityConfigurerAdapter.configure(HttpSecurity)
en la URL WebSecurityConfigurerAdapter.configure(HttpSecurity)
de mi proxy de Zuul. Pero esto solo hizo que mi aplicación se quejara de demasiados redireccionamientos. (Podría haber causado un bucle allí.)
¿Cuál sería la mejor manera de configurar esto?
- ¿Tengo que implementar algún tipo de estrategia de reenvío propia al reemplazar un bean?
- ¿Hay una opción de configuración que me falta?
- ¿Es mi idea en sí errónea? (En su respuesta a ¿Cómo evitar la redirección a otro host con Zuul? Dave Syer dice que normalmente no representaría esto pero no explica por qué).
Hasta donde entiendo su pregunta, spring-cloud-security
(para la parte EnableOauth2Sso
) y spring-cloud
(para zuul), esto no es posible enviar las llamadas al servidor de autorización usando zuul. La razón principal es que spring-cloud-security
protege la puerta de enlace de forma independiente (y antes de tener en cuenta) la lógica de enrutamiento de Zuul.
Lo que significa que (la configuración de muestra del ejemplo OAuth2 de Dave Syer) spring.oauth2.client.*
Configuration
spring:
oauth2:
client:
accessTokenUri: http://localhost:9999/uaa/oauth/token
userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
clientId: acme
clientSecret: acmesecret
Se considera antes de permitir cualquier acceso a las rutas zuul.routes.*
Zuul zuul.routes.*
Además, esta configuración le permite al agente del cliente almacenar dos Cookies: una para el Gateway y otra para el Servidor de Autorización.
Espero que esto ayude.
Actualización : POC se puede encontrar aquí https://github.com/kakawait/uaa-behind-zuul-sample
¿Intentaste seguir la configuración (en el servidor zuul
):
zuul:
routes:
uaa-service:
path: /uaa/**
stripPrefix: false
security:
# Disable Spring Boot basic authentication
basic:
enabled: false
oauth2:
sso:
loginPath: /login
client:
accessTokenUri: https://<zuul hostname>/uaa/oauth/token
userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
...
Básicamente funciona en mi proyecto, lo único que tengo que hacer es deshabilitar la protección CSRF
en la /uaa/oauth/token
.
El servidor de autenticación debería estar en
server:
# Use different context-path to avoid session cookie overlapping
context-path: /uaa
Probado utilizando Spring-Cloud.Brixton.M3
Gracias a @thomas-letsch , deberías modificar tu seguridad como siguiendo (muestra)
public void configure(HttpSecurity http) throws Exception {
http.logout().and()
.antMatcher("/**").authorizeRequests()
.antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll()
.anyRequest().authenticated().and()
.csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/oauth/token").and()
.addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class);
}