La requête $ http n’envoie pas de cookies sur plusieurs domaines dans CORS angular

Tout d’abord, je tiens à dire que j’ai lu toutes les questions de Stack et tout ce qui concerne CORS, mais la mise en œuvre ne fonctionne toujours pas. Mon APP est construit sur la démo angular crud :

J’ai donc dans la configuration de l’application:

$httpProvider.defaults.useXDomain = true; $httpProvider.defaults.withCredentials = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; 

et je sais qu’ils sont correctement définis (avec le débogage). Dans mon application “Sécurité”, je fais une demande pour l’utilisateur actuel, inter-domaine:

 return $http.get(LAYOUT_CONFIG.baseURL + '/current-user').then(function(response) { //service.currentUser = response.data.user; service.currentUser = response.data; return service.currentUser; }); 

Je reçois ces en-têtes à la première demande:

  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 

Donc, Set-Cookie est là. Cependant, la demande suivante de $ http.get (de angular) n’envoie pas le cookie qui aurait dû être défini auparavant.

 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 

mais voici la partie intéressante. Si je lance le code suivant dans la console:

 $.ajax("https://app.vibetrace.com/current-user", { type: "GET", success: function(data, status, xhr) { }, xhrFields: { withCredentials: true }, crossDomain: true }); 

l’en-tête de la demande contient les 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’est-ce que je manque?

    Avez-vous vu cette? Communication entre AngularJS et un service Web Jersey, situés dans un domaine différent. Impossible d’accéder à la session correcte

    Essayez de passer un object config à $ http spécifiant withCredentials, qui devrait fonctionner dans toutes les versions.

     $http({withCredentials: true, ...}).get(...) 

    Et la discussion ici: https://github.com/angular/angular.js/pull/1209

    Définir withCredentials=true devrait fonctionner, et en particulier la partie où cela fonctionne avec $ ajax est frustrante. Cela me porte à croire que le problème ne réside pas dans le client, mais dans une combinaison de ce que le serveur renvoie et de la façon dont vous le testez.

    Êtes-vous sûr de tester sur le même chemin avec jQuery et Angular?

    Le problème peut être lié au cookie que vous récupérez du serveur. Si le chemin d’access n’est pas défini correctement, le navigateur n’enverra pas les cookies avec les demandes aux autres chemins. Cela vaut également pour d’autres propriétés, mais le chemin est le plus probable.

    Cela n’aurait aucun rapport avec la configuration angular, mais cela pourrait néanmoins vous faire perdre quelques heures.

    En dehors de cela, la seule explication probable est que vous utilisez une ancienne version de Angular, mais compte tenu des détails de votre question et des liens vers d’autres réponses qui me semblent peu probables.

    Je vois deux sous-domaines différents.

    • admin.vibetrace.com
    • app.vibetrace.com

    Essayez de définir explicitement le cookie de votre domaine principal:

     Set-Cookie:vibetrace.ssid=...; Domain=.vibetrace.com; Path=/; Expires=... 

    Référence: Wikipedia: HTTP Cookie – Domaine et chemin