Обычная аутентификация с использованием XHR

Я пытаюсь получить ответ от моего сервера, который нуждается в базовой аутентификации. Поэтому, когда я использую curl как:

curl -u user:pass http://myserver.com/get/send-my-data

Это дает мне правильный ответ. Но когда я создаю запрос XHR, используя jquery AJAX. У меня ошибка 403. Вот моя настройка AJAX:

            $.ajax ({
            type: 'GET',
            url: 'http://myserver.com/get/send-my-data',
            beforeSend: function(xhr) {
                xhr.setRequestHeader("Authorization", "Basic" + encode64(user:pass)); // I have calculated base64 encoded value of user:pass correctly.
            },
            success: function(d) { console.log(d); },
            crossDomain: 'true'
        });

У меня 403 ответ. Вот заголовок запроса, полученный из curl с использованием опции -v.

> POST /get/send-my-data HTTP/1.1
**> Authorization: Basic ********** // Removed original code deliberately**
> User-Agent: curl/7.27.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 264
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------3c0e06f1e2b4

Вот заголовок, полученный из charles моего XHR-запроса

OPTIONS /get/send-my-data HTTP/1.1
Host    10.40.55.110:4502
Access-Control-Request-Method   GET
Origin  http://localhost:8080
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML,     like Gecko) Chrome/22.0.1229.79 Safari/537.4
**Access-Control-Request-Headers    origin, authorization, accept**
Accept  */*
Referer http://localhost:8080/proof/check.html
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.3

Я не мог понять, почему это происходит? Почему мой заголовок запроса XHR не показывает заголовок авторизации, как показано в заголовке curl. Пожалуйста, предложите, где я делаю неправильно.

PS: это междоменный запрос.

 sachinjain02401 нояб. 2013 г., 09:18
@ Лука, я добавил правильный ответ. Мне жаль, что я оставил этот вопрос без ответа, чего обычно не делаю. В случае GET вам не нужно отправлять предварительный запрос, потому что он не может вносить какие-либо изменения на сервер, поэтому сервер не беспокоится в случае GET.
 Luke31 окт. 2013 г., 23:27
Вы когда-нибудь выясняли это? У меня та же проблема. Забавно, что если я делаю POST, там есть заголовок авторизации, но он исчезает, если я делаю GET

Ответы на вопрос(1)

Решение Вопроса

потому что я отправлял междоменный запрос и запрос использовал метод POST. Поэтому, когда у нас есть POST на междоменном сервере, есть концепцияпредполетный который входит в картину.

В Preflight он просто отправляет заголовок параметров и сообщает ресурсу, на какой запрос будет выполнен запрос. Затем сервер решает, безопасно ли отправлять запрос или нет.

И затем, если сервер отправляет ОК, фактический запрос отправляется. Может быть, эти строки будут более объяснительными.

Предварительно выданные запросы сначала отправляют HTTP-запрос методом OPTIONS ресурсу в другом домене, чтобы определить, безопасен ли фактический запрос для отправки. Межсайтовые запросы предварительно просматриваются следующим образом, поскольку они могут иметь значение для пользовательских данных. В частности, запрос предварительно просвечивается, если:

Он использует методы, отличные от GET, HEAD или POST. Кроме того, если POST используется для отправки данных запроса с Content-Type, отличным от application / x-www-form-urlencoded, multipart / form-data или text / plain, например, если запрос POST отправляет полезную нагрузку XML на сервер, используя application / xml или text / xml, то запрос предварительно просвечивается.

Он устанавливает пользовательские заголовки в запросе (например, запрос использует заголовок, такой как X-PINGOTHER)

Источник: документация MDN CORS.

Ваш ответ на вопрос