Выполнение междоменного запроса с заголовком аутентификации

Во-первых, сервер (не мой) возвращает следующие заголовки:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Я пытаюсь выяснить, как передать запрос на сайт с токеном аутентификации. Я запускаю код на локальном сервере Apache.

Это мой код:

function get_data(){
    var url = '$URL';
    var x = new XMLHttpRequest();
    x.open("GET", url, true)
     if (x.readyState == 4 && x.status == 200) {
        var responseText = x.responseText;
        console.log(responseText)
        };
    x.setRequestHeader("Authentication", "Bearer $TOKEN");
    x.withCredentials = true
    x.send()
}

Консоль возвращает:

XMLHttpRequest не может загрузить $URL. Ответ на предварительный запрос не проходит проверку управления доступом: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost' запрещен. В ответе был код состояния HTTP 403.

Читая документацию, я увидел, что вручную устанавливать заголовки нельзя. Когда я удалил x.setRequestHeader("Authentication", "Bearer $TOKEN");, я получил ответ от сервера (очевидно, ошибка аутентификации). Итак, как мне добавить эту информацию в мой запрос?

Заголовки, возвращаемые сервером:

Request URL:$serverurl
Request Method:OPTIONS
Status Code:403 Forbidden
Remote Address:$ipaddress
Response Headers
view source
Cache-Control:no-cache
Connection:close
Content-Type:text/html
Request Headers
view source
Accept:"*/*"
Accept-Encoding:gzip, deflate, sdch
Accept-Language:nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:authentication
Access-Control-Request-Method:GET
Connection:keep-alive
Host:$host
Origin:http://localhost
Referer:http://localhost/mv.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36

person wasmachien    schedule 27.01.2016    source источник
comment
Пожалуйста, объясните значение $URL. Это токен или заполнитель для реального URL-адреса сервера?   -  person Roberto    schedule 27.01.2016
comment
аналогично $TOKEN -   -  person Jaromanda X    schedule 27.01.2016
comment
Я заменил URL-адрес и токен здесь из соображений конфиденциальности, они правильно размещены в моем коде. Что бы это ни стоило, я без проблем написал точно такой же скрипт на Python.   -  person wasmachien    schedule 27.01.2016


Ответы (1)


Перед вашим фактическим запросом GET браузер отправляет запрос OPTION, чтобы проверить, какие «варианты» у него есть для запроса (разрешенные методы, источники и т. д.).

Проверьте вкладку сети на наличие запроса параметров (предварительная проверка), который отправляет браузер. Этот запрос должен иметь соответствующие заголовки ответа, например.

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, OPTIONS

См. здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Methods

Поскольку сервер отправляет заголовок состояния 403 для запроса параметров, это означает, что сервер не обрабатывает запрос параметров правильно или просто устанавливает 403 для вашего хоста в качестве меры безопасности. Если это не будет изменено, вы не сможете получить доступ к этому API через XHR.

person ahmed.hoban    schedule 27.01.2016