У меня есть сервер на основе REST, с которым я пытаюсь связаться с использованием JQuery. Как XML, так и JSON доступны как форматы ответов, поэтому я использую JSON.
Соединения - это все SSL, поэтому базовая аутентификация HTTP была нашим методом авторизации по выбору, и у нас не было проблем с другими интерфейсами (raw Javascript, Silverlight и т.д.)
Теперь я пытаюсь собрать что-то вместе с JQuery и иметь бесконечные проблемы с использованием HTTP Basic Authentication.
Я просмотрел многочисленные предыдущие вопросы, большинство из которых либо имеют решения, которые, по-видимому, не работают, и не обвиняют всю проблему в доступе к кросс-контенту, что я уже преодолел в основном тестировании 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, похоже, рассматривает даже другой номер порта на той же машине, что и "кросс-сайт".