Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problemas com CORS e Access-Control-Allow-Origin(*)

Olá,para a minha api utilizei oauth2 no lugar de jjwt e também utilizei um filtro para o cors devido a uma imcompatibilidade ente o Spring -security e o auth2, quando coloco em produção eu recebo um erro de cors:

insira seu código aqui
from origin 'http://localhost:8081' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

Meu filtro:

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

       @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-Credentials", "true");
           response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
           response.setHeader("Access-Control-Max-Age", "3600");
           response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization");
           response.setHeader("Access-Control-Expose-Headers", "Location");

           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() {}

}

Lendo vi que não é permitido utilizar response.setHeader("Access-Control-Allow-Origin", "*"); e response.setHeader("Access-Control-Allow-Credentials", "true"); juntos, mas é muito ruim eu ter que definir uma lista de origens que podem acessar, eu gostaria mesmo que fosse qualquer uma origem, mas por causa da autenticação eu tenho o header Access-Control-Allow-Credentials", "true".

Minha pergunta é existe alguma forma de liberar qualquer origem mesmo usando o allow credentials como true? qual a real necessidade de termos esse header allow credentials, quais os impactos de não ter ou ter ele setado para false?

1 resposta
solução!

Oi Ricardo,

Nunca tinha visto esse cabeçalho Access-Control-Allow-Credentials, precisaria pesquisar mais a respeito sobre sua necessidade e funcionamento.

Mas de qualquer maneira é sempre uma má prática em relação à segurança deixar o allow-origin com *, sendo ideal liberar manualmente os endereços permitidos. Dá mais trabalho, mas é a recomendação.