обрабатывать 401 несанкционированную ошибку на Windows Phone с помощью Phonegap

Я создаю приложение с телефонной связью на Windows Phone 7, которому требуется аутентификация на сервере. Когда мы вошли с правильным именем пользователя и паролем, мы получили статус 200. И все работает. Но если мы ошибаемся в логине или пароле, сервер возвращает нам ошибку 401. Это замораживает мое приложение. Мне нужно убить его и перезапустить. Так что не очень практика.

Я проверяю ответ с помощью скрипача на своем компьютере, и телефон получает ошибку 401, и я управляю этой ошибкой в ​​​​своем коде. это работает на моей другой платформе (android и ios).

Поэтому я хотел бы знать, как я могу справиться с этой ошибкой. Возможно, я могу изменить файл cs в проекте Windows Phone, чтобы обработать эту ошибку.

любая помощь приветствуется

Вот код

$.support.cors = true;
    $.ajax({
        type: "POST",
        dataType: "HTTP/1.1",
        url: 'https://xxx.xxx-xxx.com/issue/wrap',
        data: data,
        cache: 'false',
        async: false,
        error: function (data) {
            console.log(data);
            console.log("error");
            //navigator.notification.alert(data);
        },
        complete: saveToken
    });

Спасибо


person dpfauwadel    schedule 03.06.2013    source источник
comment
как у вас проходит аутентификация?   -  person Enoque Duarte    schedule 07.06.2013


Ответы (3)


Я столкнулся с той же проблемой, и единственное решение, которое я нашел, - это реализовать плагин Phonegap.

Вот код С#, который я использую:

namespace WPCordovaClassLib.Cordova.Commands
{
    [DataContract]
    public class PhonegapWindowsPhonePostObject
    {
        [DataMember(IsRequired = false, Name = "yourParamName1")]
        public string yourParam1;

        [DataMember(IsRequired = false, Name = "yourParamName2")]
        public string yourParam2;
    }

    public class PhonegapWindowsPhonePost: BaseCommand
    {
        public void post(string options)
        {
            PhonegapWindowsPhonePostObject pwppo = JSON.JsonHelper.Deserialize<PhonegapWindowsPhonePostObject>(options);

            try
            {
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    var data = "YOUR DATA STRING HERE"; //use the pwppo object to retrieve your parameters
                    var url = "URL OF THE SERVICE HERE";


                    WebClient wc = new SharpGIS.GZipWebClient();
                    var URI = new Uri(url);
                    wc.Encoding = Encoding.UTF8;
                    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                    wc.UploadStringCompleted += new UploadStringCompletedEventHandler(wc__UploadStringCompleted);
                    wc.UploadStringAsync(URI, "POST", data);
                });

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            try
            {
                if (e.Result != null)
                    this.DispatchCommandResult(new PluginResult(PluginResult.Status.OK, e.Result));
                else
                    this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error 401"));
            }
            catch (Exception ex)
            {
                this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ex.Message));
                // no http status code available
            }
        }
    }
}

А вот код Javascript для вызова плагина из вашего приложения:

function loginToWebService(yourParam1, yourParam2) {

    var options = { "yourParamName1": yourParam1, "yourParamName2": yourParam2};
    cordova.exec(success, error,"PhonegapWindowsPhonePost","post", options);
}

Я надеюсь, что это поможет вам.

Примечание: версия Phonegap 2.8 не решает проблему, вопреки тому, что сказано в примечании к выпуску...

До свидания !

person Antoine    schedule 11.06.2013
comment
Надеюсь, эта проблема будет решена Phonegap или Microsoft, если это связано с IE. - person Antoine; 11.06.2013
comment
Я открыл задачу в системе отслеживания проблем Cordova, так как у меня была похожая/такая же проблема:issues.apache.org/jira/browse/ - person Thomas Kremmel; 26.06.2013
comment
У меня были проблемы даже с Cordova 3.1 - я разместил свое решение здесь stackoverflow.com/a/20306485/1994642. Это также плагин. - person stiller_leser; 01.12.2013

Sup, как вы делаете аутентификацию?

если ты используешь XMLHttpRequest() лайк: var request = new XMLHttpRequest();

попробуйте проверить, что происходит с чем-то вроде: console.log("status: " + request.status);

Если это работает, вы можете использовать:

if (request.status == 401) {
    // blabla
return;
}
person Enoque Duarte    schedule 07.06.2013
comment
Я уже обрабатываю такую ​​​​ошибку. Но проблема в том, что приложение просто зависает, когда возвращается 401. Мы не можем обработать ответ в коде javascript. - person dpfauwadel; 07.06.2013
comment
ну тогда извини, без понятия, расслабься и приготовь попкорн - person Enoque Duarte; 07.06.2013
comment
Вы пытались обернуть запрос на попытку поймать? -трицепция :D - person Enoque Duarte; 07.06.2013
comment
почему бы вам не сделать так, чтобы на стороне сервера возвращалась строка, а не ошибка? - person Enoque Duarte; 07.06.2013
comment
Пытаюсь найти документацию, но в основном PhoneGap не ловит ответы 401 статуса. Для этого я реализовал 10-секундный тайм-аут при попытках входа в систему, а затем просто предположил, что если он истекает, это неправильное имя пользователя/пароль. Очень надеюсь, что Кордова исправит это! - person ganders; 25.08.2014

У меня была эта проблема в течение последних нескольких месяцев, и, наконец, я понял это.

Во-первых, временный обходной путь, который мы использовали, состоял в том, чтобы установить период ожидания для запроса. Это работало, но ответ всегда был 404. Мы не знали, действительно ли произошла ошибка аутентификации или наши службы не работали. Неприемлемый обходной путь для нашей системы.

Наконец, после МНОГО гугления, я нашел настоящую проблему.

Когда возвращается ошибка 401 (что является базовой аутентификацией, сбой аутентификации), он добавляет к ответу заголовок, который называется «WWW-Authenticate». Это говорит браузеру предложить пользователю попробовать войти в систему. Веб-просмотр iOS не знает, что с этим делать, поэтому приложение зависает.

Все, что вам нужно сделать из вашей службы, это удалить заголовок WWW-Authenticate, и вы должны начать видеть 401 в своей функции ошибок.

person ganders    schedule 19.09.2014