jquery - support - La solicitud de $ http no envía cookies entre dominios en CORS angulares
jquery cross domain (3)
En primer lugar, quiero decir que he leído todas las preguntas de Stack y todo lo relacionado con CORS, pero la implementación aún no funciona. Mi aplicación está construida sobre la demo crud angular :
Así que tengo en la configuración de la aplicación:
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.withCredentials = true;
delete $httpProvider.defaults.headers.common[''X-Requested-With''];
y sé que están configurados correctamente (con depuración). En mi aplicación "Seguridad" estoy haciendo una solicitud para el usuario actual, dominio cruzado:
return $http.get(LAYOUT_CONFIG.baseURL + ''/current-user'').then(function(response) {
//service.currentUser = response.data.user;
service.currentUser = response.data;
return service.currentUser;
});
Obtengo estos encabezados en la primera solicitud:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:accept, origin, content-type, cookie
Access-Control-Allow-Methods:GET,POST
Access-Control-Allow-Origin:http://admin.vibetrace.com
Access-Control-Max-Age:1728000
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Sun, 02 Jun 2013 11:07:49 GMT
P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server:nginx/1.1.19
Set-Cookie:vibetrace.ssid=s%3A2lT2_N0-EevCJt7LbRlJ6Az1.d8xp99st%2F0RNV0VN2D4o4AJXNRT%2F%2F46v8PDVWSAbx%2Fw; Path=/; Expires=Mon, 30 Sep 2013 11:07:49 GMT
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Cache:MISS
X-Powered-By:Express
Entonces Set-Cookie está ahí. Sin embargo, la solicitud subsiguiente $ http.get (de angular) no envía la cookie que debería haberse establecido previamente.
Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Host:app.vibetrace.com
Origin:http://admin.vibetrace.com
Pragma:no-cache
Referer:http://admin.vibetrace.com/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
pero aquí viene la parte interesante. Si ejecuto el siguiente código en la consola:
$.ajax("https://app.vibetrace.com/current-user", {
type: "GET",
success: function(data, status, xhr) {
},
xhrFields: {
withCredentials: true
},
crossDomain: true
});
el encabezado de solicitud contiene las cookies.
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Cookie:fbm_245656478789760=base_domain=.vibetrace.com; __utma=199448574.828439508.1336934706.1361539088.1361819816.356; __utmc=199448574; __utmz=199448574.1361819816.356.354.utmcsr=tenlister.com|utmccn=(referral)|utmcmd=referral|utmcct=/index.php; connect.sid=s%3AZ1o9bIw0jBOmQwuhKJDG1San.%2BfshIsvupiRuK0pUJqm8EAMnMBCyxf%2Fk17cAVzcy31w; __utma=173003172.1796845739.1355503443.1369827921.1369833348.68; __utmc=173003172; __utmz=173003172.1369410587.66.5.utmcsr=stage.marketizator.com|utmccn=(referral)|utmcmd=referral|utmcct=/app/builder/; vibetrace.ssid=s%3AV6biojefu9r5DTGErKL5vYPi.KAlnWMUm8jZmPV0MpP%2FrgqwmkF6WuXEZZDyzJhozYCs
Host:app.vibetrace.com
Origin:http://admin.vibetrace.com
Pragma:no-cache
Referer:http://admin.vibetrace.com/
¿Qué me estoy perdiendo?
¿Has visto esto? Comunicación entre AngularJS y un servicio web Jersey que están en un dominio diferente. No se puede acceder a la sesión correcta
Intente pasar un objeto config a $ http que especifique conCredentials, que debería funcionar en todas las versiones.
$http({withCredentials: true, ...}).get(...)
Y la discusión aquí: https://github.com/angular/angular.js/pull/1209
Establecer withCredentials=true
debería funcionar, y en particular la parte donde funciona con $ ajax es molesta. Me lleva a creer que el problema no está en el cliente, sino en una combinación de lo que el servidor envía de vuelta y cómo lo está probando.
¿Estás seguro de que estás probando en la misma ruta con jQuery y Angular?
El problema podría estar relacionado con la cookie que recibes del servidor. Si la ruta no está configurada correctamente, el navegador no enviará las cookies con las solicitudes a otras rutas. Esto también se aplica a otras propiedades, pero la ruta es más probable.
Esto no estaría relacionado con la configuración angular, pero podría retrasar algunas horas, no obstante.
Aparte de eso, la única explicación probable es que estás usando una versión anterior de Angular, pero dado el detalle de tu pregunta y enlaces a otras respuestas que me parece poco probable.
Veo dos subdominios diferentes.
- admin.vibetrace.com
- app.vibetrace.com
Intente configurar la cookie para su dominio principal explícitamente:
Set-Cookie:vibetrace.ssid=...; Domain=.vibetrace.com; Path=/; Expires=...
Referencia: Wikipedia: Cookie HTTP - Dominio y ruta