Аутентификация пользователя с помощью XMLHttpRequest работает в IE, а не в 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 генерирует следующий запрос. Обратите внимание, что заголовок авторизации отсутствует:

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 говорится, что открытый метод должен принимать эти параметры, поэтому я не уверен, почему он не работает.


person i_am_jorf    schedule 03.02.2010    source источник


Ответы (3)


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

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

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

person i_am_jorf    schedule 03.02.2010
comment
рад, что request.setRequestHeader () вам все-таки пригодился. - person AJ.; 03.02.2010
comment
Как вам удалось обойти перекрестный вызов домена? Или твиттер правильно реагирует на ОПЦИИ? - person BrainSlugs83; 20.09.2011
comment
Перекрестный домен не был для меня проблемой ... потому что то, что я делал, было особенным. - person i_am_jorf; 20.09.2011

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

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

person EricLaw    schedule 03.02.2010

Ты пробовал:

request.setRequestHeader('Authorization', 'yourvalue');
person AJ.    schedule 03.02.2010
comment
Это ему не поможет. Обратите внимание, что Chrome отправляет запрос OPTIONS. - person EricLaw; 03.02.2010
comment
@EricLaw ему еще нужно установить заголовок авторизации. И ваш ответ тоже правильный. - person AJ.; 03.02.2010
comment
Добавление авторизации не помогает. - person i_am_jorf; 03.02.2010
comment
Заголовок авторизации будет автоматически отправлен двумя последними параметрами вызова Open (). Если вызов Open () не был x-доменом. - person EricLaw; 03.02.2010