Solicitud de CORS - ¿Por qué no se envían las cookies?
-
28-10-2019 - |
Pregunta
Tengo una obtención de AJAX de dominio cruzado que se vuelve previamente realizado 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 hace una publicación para iniciar sesión al usuario, que funciona correctamente el dominio cruzado. 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 de JavaScript Get 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 de la solicitud de opciones 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.
Solución
El problema fue con las llamadas de jQuery, parece que ya que 1.5 Witcredentials 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
});