Вызовы JQuery Ajax с базовой HTTP-аутентификацией

У меня есть сервер на основе 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, кажется, рассматривает даже другой номер порта на том же компьютере как «межсайтовый».

28
задан Kirby 24 July 2015 в 22:57
поделиться