当基本auth用户名有@符号(ios / cordova)时,Jquery .ajax失败

时间:2014-12-03 00:04:50

标签: jquery rest cordova http-basic-authentication

我有一个带jQuery 1.9.1的phonegap应用程序 只要用户名没有' @'就工作得很好其中的符号(如在电子邮件地址中)。 它只在iOS上失败。

我怀疑它可能不会对@符号或其他东西进行urlencoding。

  • iPhone 它永远不会遇到任何回调(完成,失败或总是),Wireshark显示请求没有到达服务器
  • Chrome桌面:效果很好。
  • Android ,工作正常。

     $.ajax({
            url: "https://" + this.hostname + "/alertusmw/services/rest/" + endPoint,
            type: method,
            dataType: 'json',
            contentType: 'application/com.alertus-v1.0+json',
            cache:false,
            username: this.username,
            password: this.password,
            beforeSend: function (xhr) {
                xhr.setRequestHeader("Authorization",
                    "Basic " + $.base64.encode(this.username + ":" + this.password));
            },
            data: options.data
        }).done(function(response) {
            console.log("DONE: " + method + ' completed: ');
            console.log(response);
            options.success( response );
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            console.log("FAIL: " + method + " FAILED: " + textStatus + "\n" + "ERROR THROWN: " + errorThrown);
            console.log("jqXHR thing: ", jqXHR);
            options.error(jqXHR,textStatus,errorThrown);
        })
        .always(function(jqXHR, textStatus, errorThrown) {
            console.log("In the always", jqXHR, textStatus, errorThrown);
        });
    
    • 验证了i64和Chrome桌面上的base64标题相同。
    • 这不是ssl证书问题。
    • 这不是一个角色问题
    • 它不是无效的用户/通行证

如果用户名没有' @'

,那么再次完美运作

我怀疑它是url编码的原因是它是否将其发布为: https://user@domain:password@blah.domain.com,浏览器可能不会包含domain:password部分作为主机(因为第一个@是用户分隔的内容:从域名传递...

这里有什么能帮助我解决这个问题:

enter image description here

^ - 我认为base64编码的全部内容完全是为了避免导致问题的特殊字符...所以我认为这可能是Chrome有用......

相关SO帖子: - Basic Authentication fails in cordova ios(没有答案,略有不同)

3 个答案:

答案 0 :(得分:1)

我敢打赌问题不是使用contentType : "application/x-www-form-urlencoded"

无论如何,您绝对应该针对真实设备调试Webview,以在Safari控制台上查找xhr错误。如果您不熟悉Safari远程调试,那很简单:

  • 在iPhone / iPad中,转到设置 - > Safari - >高级=>启用Web Inspector。
  • 通过电缆连接到MacOSX,然后从" Develop"中选择你的应用程序。桌面上的Safari菜单
  • 现在检查有关您的请求的任何错误,或者更好的是,逐步调试代码和回调。

答案 1 :(得分:0)

尝试在base64编码之前包装encodeURIComponent()。

beforeSend: function (xhr) {
        xhr.setRequestHeader("Authorization",
            "Basic " + $.base64.encode(encodeURIComponent(this.username + ":" + this.password)));
    },

答案 2 :(得分:0)

如果base64encoded文本在另一端是UNencoded,它仍然看起来像(如你所说),user@domain:password@blah.domain.com尝试使用这样的函数:

var getAuthToken = function (user, pass) {
    var token = "";
    if (user) {
        token = token + encodeURIComponent(user);
    }
    if (pass) {
        token = token + ":" + encodeURIComponent(pass);
    }
    token = $.base64.encode(token);
    return "Basic " + token;
};

然后稍微更改您的代码:

xhr.setRequestHeader("Authorization", getAuthToken(this.username, this.password));