web-dev-qa-db-fra.com

La requête $ http n'envoie pas de cookies entre domaines dans angular CORS

Tout d'abord, je veux dire que j'ai lu toutes les questions de Stack et tout ce qui concerne CORS, mais l'implémentation ne fonctionne toujours pas. Mon APP est construite sur démo angulaire de 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 débogage). Dans mon application "Sécurité", je fais une demande pour l'utilisateur actuel, cross-domaine:

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

J'obtiens 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

Set-Cookie est donc là. Cependant, la requête $ http.get suivante (depuis angular) n'envoie pas le cookie qui aurait dû être défini précédemment.

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 j'exécute 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 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 qui me manque?

35
Alexandru R

Avez-vous vu cette? Communication entre AngularJS et un Webservice Jersey qui sont sur un domaine différent. Impossible d'accéder à la session correcte

Essayez de passer un objet de configuration à $ http qui spécifie withCredentials, qui devrait fonctionner dans toutes les versions.

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

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

24
David Riccitelli

Réglage withCredentials=true devrait fonctionner, et en particulier la partie où cela fonctionne avec $ ajax est vexant. Cela m'amène à croire que le problème ne vient pas du client, mais d'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 n'est pas défini correctement, le navigateur n'enverra pas les cookies avec les demandes à d'autres chemins. Cela vaut également pour d'autres propriétés, mais le chemin est le plus probable.

Cela ne serait pas lié à la configuration Angular, mais cela pourrait néanmoins vous faire reculer de quelques heures.

À part cela, la seule explication probable est que vous utilisez une ancienne version d'Angular, mais compte tenu du détail de votre question et des liens vers d'autres réponses qui me semblent peu probables.

4
iwein

Je vois deux sous-domaines différents.

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

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

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

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

1
Sanjo