当基本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));