4

Следующая функция работает в IE, но не в Chrome:Идентификация пользователя с помощью XMLHttpRequest работает в 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 говорит, что метод open должен принимать эти параметры, поэтому я не уверен, почему он терпит неудачу.

ответ

3

Решение было то, что мне нужно, чтобы добавить

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

То, как я это делаю, - это ... особенное ... так что это может быть не очень полезно для других. Но как только я добавил, что этот веб-кит начал добавлять авторизацию.

+0

happy request.setRequestHeader() был полезен для вас в конце концов. –

+0

Как вы обошли вызов перекрестного домена? Или твиттер правильно реагирует на ВАРИАНТЫ? – BrainSlugs83

+0

Перекрестный домен не был для меня проблемой ... потому что то, что я делал, было особенным. –

2

Вы пробовали:

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

Это не поможет ему. Обратите внимание, что Chrome отправляет запрос OPTIONS. – EricLaw

+0

@ EricLaw ему все еще нужно настроить заголовок авторизации. И ваш ответ тоже прав. –

+0

Добавление авторизации не помогает. –

3

От взгляда этого, вы пытаетесь сделать X-домена XMLHTTPRequest, поэтому Chrome отправляет запрос OPTIONS перед полетом. Поскольку сервер Twitter не отвечает на запрос OPTIONS, указывающий, что доступ к X-Domain в порядке, вы получаете сбой здесь.

Ваш код будет работать только в IE в локальной зоне компьютера, или при выключении х-домен-проверку (очень опасный)

+0

То, что работает в IE из-за LMZ, кажется правдой. –