4

La fonction suivante fonctionne dans IE, mais pas dans Chrome:Authentification de l'utilisateur avec XMLHttpRequest fonctionne dans IE, pas dans 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 génère la demande suivante. Notez l'en-tête d'autorisation est manquante:

 
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 

Je reçois la réponse suivante (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."} 

Alors, comment suis-je censé passer un nom d'utilisateur et mot de passe XHR? La documentation de Webkit/Safari indique que la méthode ouverte devrait prendre ces paramètres, donc je ne suis pas sûr de savoir pourquoi cela échoue.

Répondre

3

x-domain-contrôle (très dangereux) La solution était que je devais ajouter

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

La façon dont je fais cela est ... spéciale ... donc cela ne sera peut-être pas très utile pour les autres. Mais une fois que j'ai ajouté ce webkit a commencé à ajouter l'autorisation.

+0

content request.setRequestHeader() était utile après tout. –

+0

Comment avez-vous contourné l'appel inter-domaine? Ou Twitter répond-il correctement aux OPTIONS? – BrainSlugs83

+0

Cross domain n'était pas un problème pour moi ... parce que ce que je faisais était spécial. –

2

Avez-vous essayé:

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

Cela ne l'aidera pas vraiment. Notez que Chrome envoie une demande OPTIONS. – EricLaw

+0

@EricLaw il doit encore définir l'en-tête d'autorisation. Et ta réponse est bonne aussi. –

+0

Ajout d'autorisation n'aide pas. –

3

De l'apparence de celui-ci, vous essayez de faire un X-domaine XMLHttpRequest, ce qui est la raison pour laquelle Chrome envoie les options de demande avant le vol. Parce que le serveur Twitter ne répond pas à la demande OPTIONS indiquant que l'accès X-Domain est correct, vous obtenez un échec ici.

Votre code ne fonctionne que dans IE dans la zone de l'ordinateur local, ou si vous éteignez

+0

Cela fonctionne dans IE à cause de LMZ semble être vrai. –