2012-01-14 21 views
47

Tengo un AJAX GET entre dominios que se realiza previamente con éxito, pero las cookies no se adjuntan a la solicitud GET. Cuando el usuario hace clic en un botón de inicio de sesión, se realiza una POST para iniciar sesión en el usuario, que funciona correctamente entre dominios. El JavaScript es:Solicitud de CORS: ¿por qué no se envían las cookies?

 $.ajax(signin_url, { 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      data: JSON.stringify(credentials), 
      success: function(data, status, xhr) { 
       signInSuccess(); 
      }, 
      error: function(xhr, status, error) { 
       signInFailure(); 
      }, 
      beforeSend: function(xhr) { 
       xhr.withCredentials = true 
      } 
     }); 

Las cabeceras de respuesta incluyen una cookie:

Set-Cookie:user_token=snippysnipsnip; path=/; expires=Wed, 14-Jan-2032 16:16:49 GMT 

Si el inicio de sesión tiene éxito, una petición GET JavaScript está hecho para obtener los datos del usuario actual:

function signInSuccess() { 
    $.ajax(current_user_url, { 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     success: function(data, status, xhr) { 
      displayWelcomeMessage(); 
     }, 
     beforeSend: function(xhr) { 
      xhr.withCredentials = true; 
     } 
    }); 
} 

Los encabezados relacionados con CORS devueltos por la solicitud OPTIONS de Chrome son:

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow 
Access-Control-Allow-Methods:POST, GET, OPTIONS 
Access-Control-Allow-Origin:http://192.168.0.5 
Access-Control-Max-Age:1728000 

Sin embargo, no se envían cookies en la solicitud GET.

Respuesta

65

El problema fue con la llama jQuery - parece desde 1,5 withCredentials deben ser especificados como:

 $.ajax("http://localhost:3000/users/current", { 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      success: function(data, status, xhr) { 
       hideAllContent(); 
       $("#sign_out_menu_item").show(); 
       $("#sign_in_menu_item").hide(); 
       $("#welcome").text("Welcome " + data["username"] + "!"); 
       $("#welcome").show(); 
      }, 
      xhrFields: { 
       withCredentials: true 
      }, 
      crossDomain: true 
     }); 
+6

han pasado 4 horas en conseguir que esto funcione. Ojalá hubiera visto esta publicación antes. ¡Gracias! – ChrisRich

+0

PUT/OPTIONS no parece funcionar de la misma manera. ¿Por qué se enviarían las cookies para GET/POST pero no para la solicitud PUT de verificación previa? –

+2

Las cookies no funcionan (no se configuran) en localhost. Use el dominio basado en IP en su lugar (por ejemplo, '127.0.0.1') si necesita usar cookies localmente. – Dziamid

Cuestiones relacionadas