Impossible de supprimer cookie avec les $cookies D'AngularJS

Mon application web est fait de telle sorte que lorsqu'un utilisateur se connecte, le serveur ajoute un en-tête Set-Cookie à la réponse, comme ceci:

Set-Cookie:JSESSIONID=1; Path=/myApp/; Secure

lors de la déconnexion, j'essaie de supprimer ce cookie sur le client (navigateur), car je m'en fous si la session a été détruite avec succès sur le serveur aussi longtemps que le cookie est supprimé. Toute session "fantôme" persistante sera nettoyée de temps en temps sur le serveur.

cependant, mon application est incapable de supprimer le cookie JSESSIONID. Dire la fonction logout a été appelée de https://test.myserver.com/myApp/app/index.html#/mySubPage et la fonction de déconnexion n':

delete $cookies["JSESSIONID"];
$location.path("/login");

le cookie n'est pas effacé. Rafraîchir la liste des cookies dans L'onglet "Ressources" dans les outils de développement Chrome montre qu'il est toujours là. Recharger la page de connexion et rafraîchir la liste des cookies dans L'onglet "Ressources" affiche toujours le cookie.

pourquoi ne puis-je pas supprimer le cookie de mon client Javascript alors que ce n'est pas un cookie HTTPOnly? Est-ce le chemin qui cause des problèmes? Ne devrait pas be, car le script tourne sur une page incluse dans le chemin du cookie. Les Cookies ne sont pas vraiment difficiles à gérer normalement, donc je suis bien conscient qu'il pourrait y avoir quelque chose de trivial que je ne vois pas ici - mais toute aide serait très appréciée.

mise à jour:

j'avais donné le mauvais chemin d'accès à mon application dans mon post original. Il est maintenant édité pour refléter le chemin correct (bien, abstraitement). Il s'avère que c'était une information critique pour la question. AngularJS utilise le chemin relatif complet de l'application comme attribut de chemin de tous les cookies qu'il crée / supprime, donc depuis que notre serveur a défini le cookie avec un chemin de /myApp/ et l'application fonctionnait sur le chemin relatif de /myApp/app, Angular essayait de supprimer l'ancien cookie, qui n'existe pas (pour écraser ou supprimer un cookie existant, le nom, le domaine et le chemin doivent tous être identiques à ceux utilisés lors de la création du cookie).

15
demandé sur Joe Dyndale 2013-01-07 16:44:15

3 réponses

je suppose que vous devriez vérifier les réponses du serveur - peut-être qu'elles incluent un champ d'en-tête 'set cookie' qui définit la valeur du cookie.

Voici un Plunker exemple cela illustre comment vous pouvez ajouter/modifier/supprimer / surveiller la valeur des cookies (mais sans réponses côté serveur qui peuvent changer les valeurs des cookies).

mais généralement ,l'objet $ cookies est une sorte d '"objet proxy" qui est bidirectionnel suivi par le module ngCookies AngularJS et d'un côté changer son les champs lorsque les cookies du navigateur sont modifiés (donc vous pouvez surveiller $pour les changements) mais aussi les changements sont reflétés dans les vrais cookies du navigateur, de sorte que vous pouvez modifier cet objet.

donc la seule raison pour laquelle les cookies ne peuvent pas être supprimés est que vous les supprimez sur le navigateur, et le serveur règle le cookie à nouveau et après avoir rechargé la page il est toujours là.

11
répondu Valentyn Shybanov 2013-12-18 13:07:19

soyez conscient du nom de domaine du cookie que vous voulez supprimer. Si vous travaillez avec plusieurs sous-domaines (i.e. un pour les ressources statiques, un autre pour l'api), votre problème pourrait être que vous essayez de supprimer un cookie pour le mauvais domaine.

regardez vos cookies avec l'outil de développement de votre navigateur de choix. Quel que soit le domaine défini pour le cookie que vous voulez supprimer et pour lequel vous avez des problèmes, spécifiez-le dans le paramètre options à supprimer. méthode.

$cookies.remove('JSESSIONID', {domain: 'domain.tld'});

CONSEIL DE SÉCURITÉ: Supprimer L'ID de session via Javascript ne supprime pas la session sur le serveur. Si votre session IDs fuit vous pourriez souffrir de la fixation de session. Il serait préférable de supprimer le cookie en appelant un terminal de déconnexion dans votre API qui effacerait complètement la session sur le serveur afin qu'elle ne puisse pas être réutilisée.

5
répondu 2upmedia 2015-10-26 21:52:48

La réponse que vous avez donnée à la mise à jour semble être correct: Angulaire $cookieStore ne peut fonctionner que sur les cookies dont la valeur de chemin est la même que le chemin courant.

le moyen de le tromper est d'utiliser la solution donnée par ajspera sur ce problème:

<head>
  <base href="/">
</head>

il suffit d'ajouter <base href="/"> à votre élément de tête du HTML, et à ce point il fonctionne.

la solution alternative est de définir le chemin du cookie en utilisant le serveur qui l'a envoyé. Dans Le Nœud.js Express qui ressemble à

res.cookie('specialCookie', 'special!', {path: '/myApp'});

notez que pour moi, il semble que $ cookieStore se déforme de la barre oblique arrière, donc vous pouvez avoir besoin de l'essayer dans les deux sens.

3
répondu srlm 2014-08-18 22:34:24