Базовый вызов междоменной аутентификации JQuery

Я создал серверную часть REST API с помощью Spring MVC и защитил его с помощью базовой аутентификации с помощью Spring Security.

Я хотел бы сделать междоменный ajax-вызов REST API из клиентов Javascript. Я не хочу использовать JSONP, потому что не хочу ограничиваться вызовами GET. Я использую CORS и поместил правильные заголовки на стороне сервера.

Предположим, что мой REST API находится в домене localhost:8087, а мой клиент — в localhost:8086, что является междоменным вызовом.

В моем Javascript-клиенте я делаю вызов ajax с помощью jQuery:

<script>
        $.ajax ({
            url: "http://localhost:8087/SpringMVC/users/user1",
            beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", "Basic xxxxxxxxxxxx"); },
            success: function(val) { console.log(val); alert("success" + val); },
            error: function(val) { console.log(val); alert("error" + val); }
        });
</script>

Моя проблема в том, что jQuery не отправляет заголовок авторизации в HTTP-запросе, и я не знаю, почему. Я не понимаю, потому что я делаю это в методе beforeSend, поэтому он должен быть внутри HTTP-запроса. Результат: у меня ошибка 401.

Когда я пробую скрипт из того же домена localhost:8087, который больше не является междоменным, у меня нет проблем.

Как это возможно?

Мой сценарий — всего лишь тест. Я не собираюсь размещать свое имя пользователя/пароль на стороне клиента. Но я хочу проверить, как выполнять ajax-вызовы для базового REST API, защищенного авторизацией. Я предполагаю, что мне нужно отправить на стороне сервера, чтобы защитить свое имя пользователя/пароль, REST API отправляет мне обратно файл cookie, и мне больше не нужно передавать имя пользователя/пароль для моих следующих вызовов ajax в REST API. Я прав ?

Я протестировал свой REST API с клиентом Chrome Advanced REST, и он работает так. Для первого запроса мне нужно передать заголовок авторизации. Тогда это не нужно. Должен ли он работать так же с моим веб-клиентом javascript? Я намерен использовать Node.JS с Backbone для его сборки.

Большое спасибо.

EDIT2: Похоже, проблема в браузере CORS. Я добавил заголовок Access-Control-Allow-Methods для метода OPTIONS на стороне сервера, и он работает в Chrome. У меня есть доступ к ответу JSON без ошибок. Но мне все еще нужно использовать заголовок авторизации для следующих запросов. Как сообщить jQuery использовать отправленный файл cookie?

И когда я пытаюсь использовать Firefox 11, у меня нет доступа к ответу json, и у меня возникает ошибка:

"NetworkError: 401 Non-Autorisé - http://localhost:8087/SpringMVC/users/user1"
10
задан Zaki 30 December 2012 в 06:58
поделиться