Saltar al contenido

redirect_uri usando http en lugar de https

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

  1. En el application.yml del cliente Oauth2

    myCloudPath: ${MY_PROJECT_DOMAIN_NAME:http://localhost:8080}

  2. En el SecurityConfig

    @Value("${myCloudPath}")
    private String myCloudPath;
    
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.
             addFilterBefore(new MyCustomFilter(myCloudPath), OAuth2LoginAuthenticationFilter.class).
             ...
    
  3. 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");
        }
    }
    
  4. 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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *