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

我有一个带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); }); 
    • validation了base64标题在iphone和chrome桌面上是相同的。
    • 这不是一个ssl证书问题。
    • 这不是一个角色问题
    • 它不是无效的用户/通行证

如果用户名没有’@’,那么再次完美运行

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

以下是我对此的了解:

在此处输入图像描述

^ – 我认为base64编码的全部要点完全是为了避免特殊字符导致问题…所以我想也许这可能是Chrome有用…

相关SOpost: – 基本身份validation在cordova ios中失败 (没有答案,略有不同)

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

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

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

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

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

如果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));