2012-04-12 7 views
13

Estoy tratando de hacer una publicación CORS XHR con credenciales. Funciona muy bien en Chrome, pero no en Firefox. Las cookies no están presentes en los encabezados de solicitud previa al vuelo, por lo que estoy viendo un 302. Esto funciona perfectamente en Chrome, ya que las cookies están en los encabezados de solicitud de pre-vuelo y en el posterior POST.CORS withCredentials Preflight XHR no publica cookies en Firefox

¿Por qué no funcionaría esto en FF? ¿Qué me estoy perdiendo?

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

¿Alguna idea? Veo algunas publicaciones que dicen que puedo proxy la solicitud en el lado del servidor, pero preferiría que esto funcione de acuerdo con la especificación CORS.

Gracias!

+0

¿En qué versión de FF está, último? – Francisc

Respuesta

15

Por especificación en https://www.w3.org/TR/cors/#resource-preflight-requests la solicitud de verificación previa nunca incluye cookies. En concreto, la especificación dice:

  • Excluir las credenciales de usuario.

y que los enlaces a https://www.w3.org/TR/cors/#user-credentials que dice:

credenciales de usuario

El plazo para los fines de esta memoria significa cookies, autenticación HTTP y SSL del lado del cliente (...).

Dicho esto, el fragmento de código que cita anterior no debe implicar una verificación previa en absoluto: no hay detectores de eventos de carga, el método es tan sencillo método, y no hay cabeceras de autor establecidos. Entonces, si realmente está viendo una solicitud de verificación previa, la primera pregunta es por qué está sucediendo eso. ¿Tienes alguna extensión en Firefox que pueda afectar tu objeto XMLHttpRequest?

+0

Buen punto ... He omitido los oyentes del evento de carga en el fragmento de código. Es desafortunado que la especificación no permita esto. Parecería que si alguien quiere incluir cookies, deberían estar permitidas. –

+1

El objetivo de la solicitud de verificación previa es proteger el servidor de la página web haciéndole saber que alguien desea hacer algún tipo de solicitud extraña y permitiendo que el servidor haga una lista explícita de tales cosas si sabe cómo manejarlas correctamente. ... porque muchos servidores de forma predeterminada no saben cómo manejarlos correctamente. Eso significa que no hay cookies, porque eso abriría un vector de ataque contra los servidores desprevenidos. La única forma de permitir cookies allí sería si las cookies indicadas _server_ están permitidas. ¿Pero cómo haría eso? La respuesta a la verificación previa es cómo lo hace. –

+0

Interesante. Acabo de probar y Chrome no realiza una verificación previa para los oyentes del evento de carga. Eso parece ... roto –

Cuestiones relacionadas