Saltar al contenido

Servidor de autorización Spring OAuth2 JWT independiente + CORS

Puede que se de el caso de que halles algún fallo con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

¡Encontré el motivo de mi problema!

¡Solo necesitaba finalizar la cadena de filtros y devolver el resultado inmediatamente si CorsFilter procesa una solicitud de OPCIONES!

SimpleCorsFilter.java

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter 

    public SimpleCorsFilter() 
    

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) 
            response.setStatus(HttpServletResponse.SC_OK);
         else 
            chain.doFilter(req, res);
        
    

    @Override
    public void init(FilterConfig filterConfig) 
    

    @Override
    public void destroy() 
    

Después de eso, podría ignorar la solicitud de verificación previa de OPCIONES en mi AuthServer = D

Entonces, el servidor funciona como en el recorte anterior y puede ignorar el comentario de bloque con la clase MyWebSecurity al principio.

Encontré una solución usando la solución para la pregunta. Pero tengo otra forma de describir la solución:

@Configuration
public class WebSecurityGlobalConfig extends WebSecurityConfigurerAdapter 
      ....
      @Override
      public void configure(WebSecurity web) throws Exception 
        web.ignoring()
          .antMatchers(HttpMethod.OPTIONS);
      
      ...

Me encontré con un problema similar al usar lo siguiente

  • back-end Spring Boot 1.5.8.RELEASE
  • Primavera OAuth2 Spring OAuth 2.2.0.RELEASE w
  • Vuejs aplicación usando axios biblioteca de solicitudes ajax

Con postman ¡Todo funciona! Cuando comencé a hacer la solicitud de Vuejs app, entonces obtuve los siguientes errores

OPCIONES http://localhost:8080/springboot/oauth/token 401 ()

y

XMLHttpRequest no puede cargar http://localhost:8080/springboot/oauth/token. La respuesta para la verificación previa tiene un código de estado HTTP no válido 401

Después de leer un poco, descubrí que puedo instruir a mi Spring OAuth ignorar el OPTIONS solicitud anulando configure en mi WebSecurityConfigurerAdapter clase de implementación de la siguiente manera

@Override
public void configure(WebSecurity web) throws Exception 
   web.ignoring().antMatchers(HttpMethod.OPTIONS);

La adición de lo anterior ayudó, pero luego, me encontré con el CORS error especifico

OPCIONES http://localhost:8080/springboot/oauth/token 403 ()

y

XMLHttpRequest no puede cargar http://localhost:8080/springboot/oauth/token. La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay un encabezado ‘Access-Control-Allow-Origin’ en el recurso solicitado. Por lo tanto, no se permite el acceso al origen ‘http://localhost:8000’. La respuesta tenía el código de estado HTTP 403.

Y resolvió el problema anterior con la ayuda de un CorsConfig Como se muestra abajo

@Configuration
public class CorsConfig 
    @Bean
    public FilterRegistrationBean corsFilterRegistrationBean() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.applyPermitDefaultValues();
        config.setAllowCredentials(true);
        config.setAllowedOrigins(Arrays.asList("*"));
        config.setAllowedHeaders(Arrays.asList("*"));
        config.setAllowedMethods(Arrays.asList("*"));
        config.setExposedHeaders(Arrays.asList("content-length"));
        config.setMaxAge(3600L);
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    

Después de agregar la clase anterior, funciona como se esperaba. Antes de que me vaya prod voy a investigar consequences de uso

web.ignoring().antMatchers(HttpMethod.OPTIONS);

así como best practices para arriba Cors configuración. Por ahora * hace el trabajo, pero definitivamente no es seguro para la producción.

la respuesta de Cyril me ayudo partially y luego me encontré con el CorsConfig idea en este número de Github.

Si para ti ha resultado de utilidad nuestro artículo, sería de mucha ayuda si lo compartieras con el resto seniors así contrubuyes a dar difusión a nuestro contenido.

¡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 *