【问题标题】:handle 401 unauthorized error on windows Phone with Phonegap使用 Phonegap 在 Windows Phone 上处理 401 未经授权的错误
【发布时间】:2013-05-29 15:14:50
【问题描述】:

我正在 windows phone 7 上创建一个带有 phonegap 的应用程序,它需要在服务器上进行身份验证。当我们使用正确的用户名和密码登录时,我们得到了 200 状态。一切正常。但是,如果我们在登录名或密码上出错,服务器会向我们发送 401 错误。这冻结了我的应用程序。我需要杀死它并重新启动它。所以不是很练习。

我在计算机上使用 fiddler 检查响应,手机收到 401 错误,我在代码中管理此错误。这适用于我的其他平台(android 和 ios)。

所以我想知道如何处理这个错误。也许我可以在 windows phone 项目上更改一个 cs 文件来处理这个错误。

欢迎任何帮助

这里是代码

$.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
    });

谢谢

【问题讨论】:

  • 你是怎么认证的?

标签: cordova windows-phone http-status-code-401 unauthorized


【解决方案1】:

Sup,你是如何进行身份验证的?

如果你使用XMLHttpRequest() 喜欢:var request = new XMLHttpRequest();

尝试检查 somth 会发生什么,例如:console.log("status: " + request.status);

如果它看起来有效,你可以使用:

if (request.status == 401) {
    // blabla
return;
}

【讨论】:

  • 我已经处理了这样的错误。但问题是应用程序在返回 401 时只是冻结。我们无法处理 javascript 代码中的响应。
  • 好吧,对不起,不知道,冷静下来做些爆米花
  • 您是否尝试将请求包装在 try catch 中? -tryception :D
  • 为什么不让服务器端返回像字符串“拒绝”而不是错误?
  • 我正在尝试查找文档,但基本上 PhoneGap 无法捕获 401 状态响应。为此,我在我的登录尝试中实现了 10 秒的超时,然后只是“假设”如果超时,这是一个错误的用户名/密码。真的希望科尔多瓦能解决这个问题!
【解决方案2】:

我遇到了同样的问题,我找到的唯一解决方案是实现一个 Phonegap 插件。

这是我使用的 C# 代码:

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 版本并没有解决与发行说明相反的问题...

再见!

【讨论】:

  • 如果是IE问题,希望Phonegap或微软能解决这个问题
  • 我在科尔多瓦问题跟踪器上打开了一个问题,因为我遇到了类似/相同的问题:issues.apache.org/jira/browse/…
  • 即使在使用 Cordova 3.1 时我也遇到了麻烦 - 我在 stackoverflow.com/a/20306485/1994642 此处发布了我的解决方案。它也是一个插件。
【解决方案3】:

在过去的几个月里我遇到了这个问题,终于解决了。

首先,我们使用的临时解决方法是对请求实施超时期限。这行得通,但响应始终是 404。我们不知道它是否真的未能通过身份验证,或者我们的服务是否已关闭。对于我们的系统来说,这不是一个可接受的解决方法。

最后,经过大量谷歌搜索,我发现了实际问题。

当返回 401(这是基本身份验证,身份验证失败)时,它会在响应中添加一个标头,称为“WWW-Authenticate”。这告诉浏览器提示用户尝试登录。 iOS webview 不知道如何处理它,所以这就是应用程序挂起的原因。

从您的服务中,您需要做的就是删除 WWW-Authenticate 标头,您应该开始在错误函数中看到 401。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多