REST API - проблемы с CORS - PullRequest
       10

REST API - проблемы с CORS

0 голосов
/ 21 декабря 2018

У меня проблема с CORS ..

Я создал REST API с SPRING на http://localhost:8080 и использовал этот API с простым сайтом JS на http://localhost, но после применения OAuth2 следующая ошибка начала беспокоить меня.

Доступ к XMLHttpRequest в «http://localhost:8080/oauth/token' из источника» http://localhost' заблокирован политикой CORS: Ответчтобы предполётный запрос не прошел проверку контроля доступа: у него нет статуса HTTP ok

Я мог получить доступ к API без проблем CORS до OAuth (с AJAX и POSTMAN), а после применения OAuth я могиспользовать API только на POSTMAN, но я не мог сделать то же самое с AJAX.

Мой код AJAX:

function pronta(){
    var username = "postmain"; // yes, I wrote wrong
    var password = "1234";  

    function make_base_auth(user, password) {
      var tok = user + ':' + password;
      var hash = btoa(tok);
      return "Basic " + hash;
    }
    $.ajax
      ({
        type: "POST",
        url: "http://localhost:8080/oauth/token",
        dataType: 'json',
        data: {
            'grant-type': 'password',
            'username': 'Tiago',
            'password': '123'
        },
        header:{'Authorization': make_base_auth(username, password)}, // I've tried on both manners. with header and with beforeSend
        beforeSend: function (xhr){ 
            xhr.setRequestHeader('Authorization', make_base_auth(username, password)); 
        },
        success: function (){
            alert('done'); 
        }
    });
}

Мой фильтр CORS (в SPRING REST API)

    @Component
    public class SimpleCORSFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        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");

        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}

}

Фильтр работал до OAuth

Некоторые идеи, что происходит?

Tks

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Может помочь:

@Component
    public class SimpleCORSFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        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");

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

    }

@Override
public void init(FilterConfig filterConfig) {}

@Override
public void destroy() {}

}
0 голосов
/ 22 декабря 2018

Я понял .. Проблема была в том, что каждый раз, когда я пытался сделать запрос, предварительный запрос отправлялся раньше (как это делает архитектура REST).

Учитывая это, я просто готовлюсервер для разрешения методов OPTIONS.

Вот так ..

@Order(-1)    
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS, "/oauth/token").permitAll();
    }

Не забудьте @Configuration аннотацию перед началом класса.

Увидимся

...