Solución:
Encontré el mismo error cuando estoy configurando una aplicación Spring Boot para autenticar usuarios usando la implementación de Facebook OAuth2. Nginx (funciona como proxy inverso) está configurado para hacer frente a la aplicación web y también para descargar el certificado SSL.
Inicialmente, intenté personalizar la propiedad: redirect-uri-template
para que el uri de redireccionamiento pueda codificarse de forma rígida con https://{domain}/login/oauth2/code/facebook
(esto se debe a que Facebook solo acepta el protocolo HTTPS para el URI de redireccionamiento de OAuth válido). No funcionó porque encontré el mismo error: OAuth2AuthenticationException: [invalid_redirect_uri_parameter]
Luego, encontré la solución propuesta en el enlace, que funciona para mí. Entonces, es básicamente para configurar la aplicación de inicio de sesión OAuth2 con server.use-forward-headers=true
y elimine la propiedad personalizada: redirect-uri-template
.
Espero eso ayude 🙂
Me enfrenté exactamente al mismo problema pero con Google.
Tener la siguiente arquitectura de microservicios
Google Auth Server
Zuul Gateway (:8080)
/
/
/
Other OAuth2Client (:5000)
mientras se ejecuta en una máquina local, todo funciona bien, pero en AWS Elastic Beanstalk atrapo la misma excepción.
Después de la depuración, descubrí que, en mi caso, cuando OAuth2Client está detrás del proxy Zuul (se implementaron en microservicios separados) realmente obtengo diferentes valores de redirect_uri en la verificación interna OAuth2LoginAuthenticationProvider
:
if (!authorizationResponse.getRedirectUri().equals(authorizationRequest.getRedirectUri())) {
OAuth2Error oauth2Error = new OAuth2Error(INVALID_REDIRECT_URI_PARAMETER_ERROR_CODE);
throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString());
}
Entonces, en mi caso en AWS, tengo los siguientes valores:
authorizationResponse.getRedirectUri()
http://[INNER_AWS_ESB_IP]:5000/auth/login/oauth2/code/google
authorizationRequest.getRedirectUri()
https://[MY_PROJECT_DOMAIN_NAME]/auth/login/oauth2/code/google
dónde [INNER_AWS_ESB_IP]
es una dirección IP de la red interna en AWS Elastic Beanstalk y [MY_PROJECT_DOMAIN_NAME]
es un nombre de dominio de mi proyecto, que está codificado en application.yml
como redirect-uri-template
parámetro.
Tengo la siguiente configuración en application.yml
de mi OAuth2Client microservicio
server:
port: 5000
servlet:
contextPath: /auth
use-forward-headers: true
spring:
security:
oauth2:
resource:
filter-order: 3
client:
registration:
google:
client-id: [REMOVED]
client-secret: [REMOVED]
redirect-uri-template: ${MY_PROJECT_DOMAIN_NAME:http://localhost:8080}/auth/login/oauth2/code/google
scope: profile,email
Loreno, ¿qué tipo de arquitectura tienes? ¿Puedes compartir tu configuración?
ACTUALIZAR
Parece que el problema está conectado directamente con la implementación de Spring Security Oauth2 Client en la versión Science 5.0
El problema se puede reproducir, si se inicia el microservicio Zuul Gateway en alguna máquina virtual separada y otros microservicios deben iniciarse en la máquina local ☝️ Por lo tanto, se debe llamar a Google desde el navegador en la VM.
La solución lo que me ayuda a evitar este problema es agregar personalizado Filter
con costumbre HttpServletRequestWrapper
que puede anular el método y devolver la URL “correcta” para satisfacer el registro OAuth2LoginAuthenticationProvider.java:115
-
En el
application.yml
del cliente Oauth2myCloudPath: ${MY_PROJECT_DOMAIN_NAME:http://localhost:8080}
-
En el
SecurityConfig
@Value("${myCloudPath}") private String myCloudPath; @Override public void configure(HttpSecurity http) throws Exception { http. addFilterBefore(new MyCustomFilter(myCloudPath), OAuth2LoginAuthenticationFilter.class). ...
-
Filtrar
public class MyCustomFilter implements Filter { private static final Logger logger = LogManager.getLogger(MyCustomFilter.class); private String myCloudPath; public MyCustomFilter(String myCloudPath) { this.myCloudPath= myCloudPath; } @Override public void init(FilterConfig filterConfiguration) throws ServletException { logger.info("MyCustomFilter init"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request = new MyHttpServletRequestWrapper((HttpServletRequest) request, myCloudPath); chain.doFilter(request, response); } @Override public void destroy() { logger.info("MyCustomFilter destroy"); } }
-
HttpServletRequestWrapper
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { public final String redirectUrl; public MyHttpServletRequestWrapper(HttpServletRequest request, String myCloudPath) { super(request); this.redirectUrl = myCloudPath + request.getRequestURI(); } @Override public StringBuffer getRequestURL() { return new StringBuffer(redirectUrl); } }
Enfrentamos el mismo problema al ejecutar OpenShift y autenticarnos en Microsoft Azure. El filtrado parecía hackear, el *.redirect-uri-template
Las propiedades ahora están en desuso y, después de regresar de Azure, los URI de redireccionamiento saliente y entrante no coincidían.
Después de mucha búsqueda, esta simple entrada en application.properties
resuelto el problema:
server.forward-headers-strategy=framework