У меня есть сервер на основе REST, с которым я пытаюсь установить связь с помощью JQuery. И XML, и JSON доступны как форматы ответов, поэтому я использую JSON.
Все соединения являются SSL, поэтому для авторизации был выбран метод базовой аутентификации HTTP, и у нас не было проблем с другими интерфейсами (необработанный Javascript, Silverlight и т. Д.)
Теперь я пытаюсь соединить что-то с JQuery и у меня возникают бесконечные проблемы с использованием базовой аутентификации HTTP.
Я изучил многочисленные предыдущие вопросы, большинство из которых либо имеют решения, которые, кажется, не работают, либо винят всю проблему в доступе из разных источников, которую я уже преодолел в базовом тестировании Javascript. В ответах всегда указывается Access-Control-Allow-Origin
, установленный на указанный заголовок Origin в запросе, и это можно увидеть в ответах моих тестов.
В базовом javascript весь этот вызов выполняется очень просто:
req.open('GET', 'https://researchdev-vm:8111/card', true, 'test', 'testpassword');
Попытка JQuery сделать это довольно стандартна:
$.ajax({
username: 'test',
password: 'testpassword',
url: 'https://researchdev-vm:8111/card',
type: 'GET',
dataType: 'json',
crossDomain: true,
/*data: { username: 'test', password: 'testpassword' },*/
beforeSend: function(xhr){
xhr.setRequestHeader("Authorization",
//"Basic " + encodeBase64(username + ":" + password));
"Basic AAAAAAAAAAAAAAAAAAA=");
},
sucess: function(result) {
out('done');
}
});
Единственный метод, который на самом деле работает для обеспечения аутентификации, - это прямая вставка закодированных в Base64 данных в функцию beforeSend()
. Если это не включено, никакого прогресса не будет достигнуто. Свойства имени пользователя и пароля полностью игнорируются.
С предоставленным поведением beforeSend()
вызов GET получает положительный ответ с включенными данными. Однако, поскольку это межсайтовый вызов, вызов OPTIONS выполняется перед вызовом GET и всегда завершается ошибкой, поскольку он не использует beforeSend()
и поэтому получает ответ 401 из-за неудачной аутентификации.
Есть ли лучший способ выполнить то, что должно быть очень тривиальным вызовом? Должен ли тот факт, что запрос OPTIONS не использует обработку функции beforeSend()
, рассматриваться как ошибка? Возможно, есть способ полностью отключить проверку OPTIONS? Невозможно сделать этот вызов не межсайтовым, поскольку Javascript рассматривает даже другой номер порта на той же машине, что и «межсайтовый».