2012-04-12 6 views
13

Ich versuche, eine CORS XHR Post mit Anmeldeinformationen zu tun. Es funktioniert hervorragend in Chrome, aber nicht in Firefox. Die Cookies sind in den Headern der Pre-Flight-Anfragen nicht enthalten, daher sehe ich eine 302. Dies funktioniert perfekt in Chrome, da Cookies in den Pre-Flight-Request-Headern enthalten sind und der nachfolgende POST durchlaufen wird.CORS withCredentials XHR Preflight nicht posten Cookies in Firefox

Warum sollte das nicht in FF funktionieren? Was vermisse ich?

// 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); 

Irgendwelche Ideen? Ich sehe einige Beiträge, die sagen, ich kann die Anfrage auf der Serverseite Proxy, aber ich würde es vorziehen, dass dies in Übereinstimmung mit der CORS-Spezifikation funktioniert.

Danke!

+0

In welcher Version von FF sind Sie zuletzt? – Francisc

Antwort

15

Pro Spezifikation bei https://www.w3.org/TR/cors/#resource-preflight-requests enthält die Preflight-Anfrage niemals Cookies. Insbesondere sagt die Spezifikation:

  • Benutzer-Credentials ausschließen.

und Links zu https://www.w3.org/TR/cors/#user-credentials die sagt:

Der Begriff Benutzerdaten für die Zwecke dieser Beschreibung bedeutet Cookies, HTTP-Authentifizierung und clientseitige SSL (...).

Das hieß, die Code-Snippet Sie oben zitieren sollten überhaupt keinen Preflight beinhalten: Es gibt keinen Upload-Ereignis-Listener, ist das Verfahren als einfache Methode, und es gibt keinen gesetzten Autor Header. Wenn Sie also eine Preflight-Anfrage sehen, lautet die erste Frage, warum das passiert. Haben Sie Erweiterungen in Firefox, die Ihr XMLHttpRequest-Objekt stören könnten?

+0

Guter Punkt ... Ich hatte die Upload-Ereignis-Listener im Code-Snippet weggelassen. Das ist bedauerlich, dass die Spezifikation dies nicht erlaubt. Es scheint, dass wenn jemand Cookies einschließen möchte, sollten sie erlaubt sein. –

+1

Der ganze Sinn der Preflight-Anfrage besteht darin, den Server vor der Webseite zu schützen, indem man ihn darüber informiert, dass jemand eine seltsame Anfrage machen möchte und der Server solche Dinge explizit in die Whitelist aufnehmen kann, wenn er weiß, wie er damit umgehen soll ... weil viele Server standardmäßig nicht wissen, wie man mit ihnen richtig umgeht. Das bedeutet keine Cookies, denn das würde einen Angriffsvektor gegen ahnungslose Server eröffnen. Die einzige Möglichkeit, Cookies zuzulassen, wäre, wenn die _server_ angegebenen Cookies erlaubt sind. Aber wie würde es das machen? Die Antwort auf das Preflight ist, wie es funktioniert. –

+0

Interessant. Ich habe es gerade getestet und Chrome führt kein Preflight für die Upload-Ereignis-Listener durch. Das scheint ... gebrochen –