使用XMLHttpRequest的用户身份验证适用于IE,而不适用于Chrome?

时间:2010-02-03 00:51:44

标签: 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会生成以下请求。请注意,缺少Authorization标头:

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

我收到以下回复(http 401):

HTTP/1.1 401 Unauthorized
Date: Wed, 03 Feb 2010 00:39:33 GMT
Server: hi
Status: 401 Unauthorized
WWW-Authenticate: Basic realm="Twitter API"
X-Runtime: 0.00107
Content-Type: application/json; charset=utf-8
Cache-Control: no-cache, max-age=300
Set-Cookie: _twitter_sess=BAh7BzoHaWQiJTUxMTc2Nzk4N2U0YzMzZmU0ZTQyNzI4NjQyYjI3ODE2Igpm%250AbGFzaElDOidBY3Rpb25Db250cm9sbGVyOjpGbGFzaDo6Rmxhc2hIYXNoewAG%250AOgpAdXNlZHsA--bb61324c3ba12c3cd1794b3895a906a69c154edd; domain=.twitter.com; path=/
Expires: Wed, 03 Feb 2010 00:44:33 GMT
Vary: Accept-Encoding
Content-Length: 73
Connection: close

{"request":"/statuses/update.json","error":"Could not authenticate you."}

那么,我应该如何将用户名和密码传递给XHR? Webkit / Safari文档说开放方法应该采用这些参数,所以我不确定它为什么失败。

3 个答案:

答案 0 :(得分:3)

从它的外观来看,你正在尝试进行X-Domain XMLHTTPRequest,这就是Chrome发送OPTIONS转航前请求的原因。因为Twitter服务器没有响应OPTIONS请求,表明X-Domain访问没问题,所以你在这里遇到了失败。

您的代码只能在本地计算机区域的IE中工作,或者如果您关闭x-domain-checking(非常危险)

答案 1 :(得分:3)

解决方案是我需要添加

request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

我这样做的方式是......特别......所以这对其他人来说可能没什么用处。但是一旦我添加了这个webkit就开始添加Authorization。

答案 2 :(得分:2)

你试过了吗?

request.setRequestHeader('Authorization', 'yourvalue');