У меня есть сервер на основе REST, с которым я пытаюсь общаться с помощью JQuery. В качестве форматов ответов доступны как XML, так и JSON, поэтому я использую JSON.
Все соединения являются SSL, поэтому мы выбрали базовую аутентификацию HTTP, и у нас не было проблем с другими внешними интерфейсами (необработанный 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, кажется, рассматривает даже другой номер порта на том же компьютере как «межсайтовый».