jquery - falta - Solicitud CORS: ¿por qué no se envían las cookies?
falta la cabecera cors ''access-control-allow-origin'' jquery (1)
Tengo un AJAX GET de dominios cruzados que se realiza con éxito previo, 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:
$.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
}
});
Los encabezados 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, se realiza una solicitud GET de JavaScript para obtener los detalles 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.
El problema estaba en las llamadas jQuery: parece que 1.5 withCredentials debe especificarse 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
});