iOS: аутентификация с использованием XMLHttpRequest — обработка ответа 401

Я пишу приложение для iOS, используя PhoneGap (он же Cordova). У меня есть простая страница входа в систему в формате html, которая регистрирует пользователя с помощью XMLHttpRequest с базовой аутентификацией через SSL. Все отлично работает, если правильно ввести логин и пароль. Однако, если вы введете неправильное имя пользователя/пароль, ни один из моих обратных вызовов никогда не будет вызван.

Если вы запустите тот же код, например, в Chrome с неправильным именем пользователя/паролем, Chrome будет вести себя аналогичным образом, за исключением того, что появится диалоговое окно с запросом аутентификации. Нажатие «Отмена» в диалоговом окне Chrome возвращает управление моему коду javascript. К сожалению, на iOS UIWebView даже не выводит диалоговое окно авторизации, он просто зависает.Мне нужен способ сообщить пользователю, что он ввел неправильное имя пользователя или пароль, чтобы он мог повторить попытку.

Ближе всего к ответу, который я смог найти, был этот http://www.freelock.com/2008/06/technical-note-http-auth-with-ajax, но с изменением статуса ответа с сервера не похоже на то, что нужно делать.

Вот как выглядит мой код запроса, но когда отправляется неверное имя пользователя или пароль, он никогда не достигает моего обратного вызова onload (на самом деле обратный вызов onreadystatechange вызывается только один раз, и это для readyState 1, также известного как OPEN).

var req = new XMLHttpRequest();
req.onload = function(ev) {
    if (req.status == 401) {
        alert("Invalid Username/Password");
        document.getElementById('password').focus();
    } else if (req.status == 200) {
        window.location.href = some_secure_site;
    } else {
        // edit //
        alert("Some other status");
    }
}
req.onerror = function (ev) { alert('Error'); };
req.ontimeout = function(ev) { alert('Timeout'); };
req.open('GET', uri, true, userValue, passValue);
req.withCredentials = true;
req.send();

10
задан Cœur 29 June 2019 в 16:46
поделиться