У меня есть сервер на основе 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, похоже, рассматривает даже другой номер порта на той же машине, что и "кросс-сайт".