Authentication XMLHttpRequest的用户身份验证在IE中有效,而不是在Chrome中?
以下功能适用于IE,但不适用于Chrome:Authentication XMLHttpRequest的用户身份验证在IE中有效,而不是在Chrome中?,authentication,twitter,webkit,xmlhttprequest,google-chrome,Authentication,Twitter,Webkit,Xmlhttprequest,Google Chrome,以下功能适用于IE,但不适用于Chrome: function doStuff() { var request = new XMLHttpRequest(); request.open("POST", "http://twitter.com/statuses/update.json", true, "USERNAME-HERE", "PASSWORD-HERE"); request.send("status=STATUS UPDATE HERE"); } Chrome生成以下请求。
function doStuff() {
var request = new XMLHttpRequest();
request.open("POST", "http://twitter.com/statuses/update.json", true, "USERNAME-HERE", "PASSWORD-HERE");
request.send("status=STATUS UPDATE HERE");
}
Chrome生成以下请求。注意:缺少授权标头:
OPTIONS /statuses/update.json HTTP/1.1
Host: twitter.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.78 Safari/532.5
Access-Control-Request-Method: POST
Origin: file://
Access-Control-Request-Headers: Content-Type
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
选项/状态/update.json HTTP/1.1
主持人:twitter.com
连接:保持活力
用户代理:Mozilla/5.0(Windows;U;Windows NT 6.1;en-US)AppleWebKit/532.5(KHTML,如Gecko)Chrome/4.0.249.78 Safari/532.5
访问控制请求方法:POST
来源:文件://
访问控制请求头:内容类型
接受:*/*
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
我得到以下响应(http 401):
HTTP/1.1 401未经授权
日期:2010年2月3日星期三00:39:33 GMT
服务员:你好
状态:401未经授权
WWW-Authenticate:Basic-realm=“Twitter-API”
X运行时间:0.00107
内容类型:application/json;字符集=utf-8
缓存控制:无缓存,最大使用年限=300
设置Cookie:_twitter_sess=bah7bzohawqijtuxmtc2nzk4n2u0yzmzzmu0ztqynzi4njqyyyji3ode2igpm%250AbGFzaElDOidBY3Rpb25Db250cm9sbGVyOjpGbGFzaDo6Rmxhc2hIYXNoewAG%250AOgpAdXNlZHsA--bb61324c3ba12c3cd1794b3895a906a69c154edd;域名=.twitter.com;路径=/
过期时间:2010年2月3日星期三00:44:33 GMT
改变:接受编码
内容长度:73
连接:关闭
{“请求”:“/statuses/update.json”,“错误”:“无法对您进行身份验证”。}
那么,我应该如何向XHR传递用户名和密码呢?Webkit/Safari文档说明open方法应该使用这些参数,因此我不确定它失败的原因。您是否尝试过:
request.setRequestHeader('Authorization', 'yourvalue');
从外观上看,您正在尝试执行一个X域XMLHTTPRequest,这就是Chrome发送选项飞行前请求的原因。因为Twitter服务器没有响应表示X域访问正常的选项请求,所以这里出现了故障
您的代码只能在本地计算机区域的IE中工作,或者如果您关闭x域检查(非常危险)解决方案是我需要添加的
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
我这样做的方式是。。。特别的。。。因此,这可能对未来的其他人没有多大用处。但一旦我添加了这个webkit,就开始添加授权。这对他并没有什么帮助。请注意,Chrome正在发送一个选项请求,但他仍然需要设置授权标头。您的答案也是正确的。添加授权没有帮助。授权标头将由Open()调用的最后两个参数自动发送。如果Open()调用不是x-domain.laid request.setRequestHeader()对您来说毕竟很有用。您是如何绕过跨域调用的?或者twitter是否正确响应选项?跨域对我来说不是问题。。。因为我所做的很特别。
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");