2012-04-12 16 views
13

Sto tentando di eseguire un messaggio XHR CORS con credenziali. Funziona alla grande in Chrome, ma non in Firefox. I cookie non sono presenti nelle intestazioni delle richieste pre-volo, quindi visualizzo un 302. Funziona perfettamente in Chrome, poiché i cookie sono presenti nelle intestazioni delle richieste pre-volo e il successivo POST passa attraverso.CORS withCredentials Preflight XHR non pubblicare cookie in Firefox

Perché non dovrebbe funzionare in FF? Cosa mi manca?

// assume url, boundEventHandler and uploadData are defined, as this definitely works in Chrome 
var xhr = new XMLHttpRequest(); 
xhr.open("POST", url, true); 
xhr.addEventListener ("readystatechange", boundEventHandler, false); 
xhr.withCredentials = true; // FWIW, I've also tried the string 'true' 
xhr.send(uploadData); 

Qualche idea? Vedo alcuni post che dicono che posso indirizzare la richiesta sul lato server, ma preferirei farlo funzionare secondo le specifiche CORS.

Grazie!

+0

Quale versione di FF sei attiva, l'ultima? – Francisc

risposta

15

Per specifica a https://www.w3.org/TR/cors/#resource-preflight-requests la richiesta di preflight non include mai i cookie. In particolare, le specifiche dice:

  • Escludere le credenziali dell'utente.

e che collegamenti a https://www.w3.org/TR/cors/#user-credentials che dice:

credenziali utente

Il termine per i fini della presente specifica significa cookie, l'autenticazione HTTP, SSL e client-side (...).

Detto questo, il frammento di codice che si citazione di cui sopra non dovrebbe comportare una verifica preliminare a tutti: non ci sono ascoltatori di eventi di upload, il metodo è il metodo semplice, e non ci sono intestazioni autore set. Quindi se stai davvero vedendo una richiesta di verifica preliminare, la prima domanda è perché sta accadendo. Avete estensioni in Firefox che potrebbero mungere il vostro oggetto XMLHttpRequest?

+0

Buon punto ... Ho omesso i listener di eventi di caricamento nello snippet di codice. Questo è un peccato che le specifiche non lo consentano. Sembrerebbe che se qualcuno vuole includere i cookie, dovrebbe essere consentito. –

+1

L'intero punto della richiesta di preflight è di proteggere il server dalla pagina Web facendo sapere che qualcuno vuole fare una sorta di richiesta strana e consentire al server di elencare esplicitamente in bianco tali cose se sa come gestirle correttamente ... perché molti server di default non sanno come gestirli correttamente. Ciò significa che non ci sono cookie, perché ciò aprirebbe un vettore di attacco contro server ignari. L'unico modo per consentire i cookie sarebbe se i cookie _server_ indicati fossero consentiti. Ma come lo farebbe? La risposta al preflight è come lo fa. –

+0

Interessante. Ho appena eseguito il test e Chrome non esegue alcuna verifica preliminare per gli ascoltatori di eventi di caricamento. Sembra ... rotto –

Problemi correlati