我有一个运行在网页上的脚本,该脚本需要使用JQuery $ .ajax方法(当前使用jquery 1.7.2)将多个GET请求提交到不同域上的服务端点。我的ajax调用可以在IE(9、10、11)中运行,但在Firefox和Chrome中显示401未经授权的响应失败。Chrome中的其他错误消息的一部分是“访问此资源需要完全身份验证”。
我的ajax调用是这样设置的(这些失败的请求的dataType为“ json”,并且async为true):
$.ajax({ url: url, type: "GET", async: isAsync, dataType: dataType, username: user, password: pswd, success: function (response, status) { // success code here }, failure: function (response, status) { // failure code here }, complete: function (xhr, status) { // on complete code here } });
我正在传递访问服务所需的用户名和密码,这在IE中有效。我知道JQuery ajax函数将正确处理身份验证,因此,如果返回响应指示需要授权,它将使用提供的凭据正确发出该请求。我在这里想念什么吗?我是否需要手动添加Authorization标头才能使其正常工作?
更新:这是Chrome和IE通过F12调试工具报告的请求,响应和cookie信息(某些信息已替换为[…已删除…])
Chrome(42.0.2311.90 m)
Response Headers access-control-allow-credentials:true access-control-allow-origin:[…removed…] access-control-expose-headers: cache-control:private,max-age=0,must-revalidate connection:keep-alive content-encoding:gzip content-length:296 content-type:text/html;charset=ISO-8859-1 date:Tue, 21 Apr 2015 20:55:12 GMT expires:Tue, 21 Apr 2015 20:55:12 GMT p3p:CP=”NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA” set-cookie:JSESSIONID=qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13;Path=/;Secure;HttpOnly set-cookie:NSC_vt1.sbmmzefw.dpn!-!IUUQT=ffffffff09091c3945525d5f4f58455e445a4a42378b;path=/;secure;httponly status:401 Unauthorized vary:Accept-Encoding version:HTTP/1.1 www-authenticate:Basic realm=”Rally ALM” Request Headers :host:rally1.rallydev.com :method:GET :path:[…removed…] :scheme:https :version:HTTP/1.1 accept:application/json, text/javascript, /; q=0.01 accept-encoding:gzip, deflate, sdch accept-language:en-US,en;q=0.8 origin:[…removed…] referer:[…removed…] user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36 Response Cookies JSESSIONID qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13 NSC_vt1.sbmmzefw.dpn!-!IUUQT ffffffff09091c3945525d5f4f58455e445a4a42378b
Response Headers
access-control-allow-credentials:true access-control-allow-origin:[…removed…] access-control-expose-headers: cache-control:private,max-age=0,must-revalidate connection:keep-alive content-encoding:gzip content-length:296 content-type:text/html;charset=ISO-8859-1 date:Tue, 21 Apr 2015 20:55:12 GMT expires:Tue, 21 Apr 2015 20:55:12 GMT p3p:CP=”NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA” set-cookie:JSESSIONID=qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13;Path=/;Secure;HttpOnly set-cookie:NSC_vt1.sbmmzefw.dpn!-!IUUQT=ffffffff09091c3945525d5f4f58455e445a4a42378b;path=/;secure;httponly status:401 Unauthorized vary:Accept-Encoding version:HTTP/1.1 www-authenticate:Basic realm=”Rally ALM”
Request Headers
:host:rally1.rallydev.com :method:GET :path:[…removed…] :scheme:https :version:HTTP/1.1 accept:application/json, text/javascript, /; q=0.01 accept-encoding:gzip, deflate, sdch accept-language:en-US,en;q=0.8 origin:[…removed…] referer:[…removed…] user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Response Cookies
JSESSIONID qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13 NSC_vt1.sbmmzefw.dpn!-!IUUQT ffffffff09091c3945525d5f4f58455e445a4a42378b
IE 11
Request Headers Request GET […removed…] Referer […removed…] Accept application/json, text/javascript, /; q=0.01 Accept-Language en-US Accept-Encoding gzip, deflate User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Host […removed…] Connection Keep-Alive Cache-Control no-cache Cookie JSESSIONID=qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08; NSC_vt1.sbmmzefw.dpn!-!IUUQT=ffffffff09091c3145525d5f4f58455e445a4a42378b; RALLY-Detail-treeCollapsed=false; ZSESSIONID=RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; SUBBUCKETID=713 Response Headers Response HTTP/1.1 200 OK RallyRequestID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-0810353108 Expires Thu, 01 Jan 1970 00:00:00 GMT Content-Type text/javascript; charset=utf-8 ETag “0101c2c8d3463ee3c1a4f950d4142b7d3” P3P CP=”NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA” Cache-Control private,max-age=0,must-revalidate Date Tue, 21 Apr 2015 20:58:17 GMT Connection keep-alive Set-Cookie ZSESSIONID=RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU;Path=/;Domain=[…removed…];Secure;HttpOnly Set-Cookie SUBBUCKETID=713;Path=/;Domain=[…removed…];Secure;HttpOnly Content-Length 319 Cookies Sent JSESSIONID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08 Sent NSC_vt1.sbmmzefw.dpn!-!IUUQT ffffffff09091c3145525d5f4f58455e445a4a42378b Sent RALLY-Detail-treeCollapsed false Sent ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU Sent SUBBUCKETID 713 Received ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU At end of session […removed…] / Yes Yes Received SUBBUCKETID 713 At end of session […removed…] / Yes Yes
Request GET […removed…] Referer […removed…] Accept application/json, text/javascript, /; q=0.01 Accept-Language en-US Accept-Encoding gzip, deflate User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Host […removed…] Connection Keep-Alive Cache-Control no-cache Cookie JSESSIONID=qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08; NSC_vt1.sbmmzefw.dpn!-!IUUQT=ffffffff09091c3145525d5f4f58455e445a4a42378b; RALLY-Detail-treeCollapsed=false; ZSESSIONID=RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; SUBBUCKETID=713
Response HTTP/1.1 200 OK RallyRequestID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-0810353108 Expires Thu, 01 Jan 1970 00:00:00 GMT Content-Type text/javascript; charset=utf-8 ETag “0101c2c8d3463ee3c1a4f950d4142b7d3” P3P CP=”NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA” Cache-Control private,max-age=0,must-revalidate Date Tue, 21 Apr 2015 20:58:17 GMT Connection keep-alive Set-Cookie ZSESSIONID=RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU;Path=/;Domain=[…removed…];Secure;HttpOnly Set-Cookie SUBBUCKETID=713;Path=/;Domain=[…removed…];Secure;HttpOnly Content-Length 319
Cookies
Sent JSESSIONID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08 Sent NSC_vt1.sbmmzefw.dpn!-!IUUQT ffffffff09091c3145525d5f4f58455e445a4a42378b Sent RALLY-Detail-treeCollapsed false Sent ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU Sent SUBBUCKETID 713 Received ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU At end of session […removed…] / Yes Yes Received SUBBUCKETID 713 At end of session […removed…] / Yes Yes
我遇到了一个jquery论坛帖子,其中包含有关此问题的一些其他信息。根据在此找到的内容,将其添加到$ .ajax调用中:
beforeSend: function (xhr) { xhr.setRequestHeader('Authorization', makeBaseAuth(user, pswd)); }
makeBaseAuth()使用btoa()函数的方式如下:
makeBaseAuth: function(user, pswd){ var token = user + ':' + pswd; var hash = ""; if (btoa) { hash = btoa(token); } return "Basic " + hash; }
这似乎在Chrome中现在可以正常使用,我没有收到登录提示或401响应,请求正在处理中,我得到了预期的响应。我也删除了该选项,xhrFields: {withCredentials: true}因为这似乎不是必需的。由于某种原因,这在Firefox中尚不可用,在Firefox调试器中,我实际上无法通过JavaScript进行任何体面的调试来查看问题所在,该脚本的工作方式是将其加载到网页中作为一个匿名脚本,我对此没有任何控制权。我有办法在IE和Chrome中找到脚本,但出于某种原因却没有Firefox。我会认为这是一个胜利,只需使其能够在Chrome中运行,这要归功于每个人都向我指引了正确的方向!
xhrFields: {withCredentials: true}