23 votes

Impossible de supprimer le cookie dans express

Assez simple. Je place un cookie comme ceci dans mon /user/login route :

if (rememberMe) {
    console.log('Login will remembered.');
    res.cookie('user', userObj, { signed: true, httpOnly: true, path: '/' });
}
else {
    console.log('Login will NOT be remembered.');
}

J'ai déjà défini mon secret pour le cookie-parser :

app.use(cookieParser('shhh!'));

C'est plutôt basique. Tout fonctionne parfaitement dans la mesure où je peux récupérer ce que j'ai stocké dans le cookie :

app.use(function (req, res, next) {
    if (req.signedCookies.user) {
        console.log('Cookie exists!');
        req.session.user = req.signedCookies.user;
    }
    else {
        console.log('No cookie found.');
    }

    next();
});

Ce middleware est appelé avant toute autre chose, donc pour le bien de l'argument "Cookie exists !" est toujours enregistré dans ma console si le cookie est valide.

Le problème se pose lorsque j'essaie de supprimer le cookie. J'ai essayé res.clearCookie('user') , res.cookie('user', '', { expires: new Date() }) et j'ai essayé de passer les mêmes drapeaux (que je passe à res.cookie() en /user/login ). J'ai essayé d'utiliser des combinaisons de ces méthodes, mais rien n'a fonctionné.

Actuellement, la seule façon d'effacer le cookie (et de ne pas recevoir le message "Cookie exists !") est d'effacer l'historique de mon navigateur. Voici à quoi ressemble mon parcours de déconnexion :

route.get('/user/logout', function (req, res, next) {
    res.clearCookie('user');
    req.session.destroy();
    util.response.ok(res, 'Successfully logged out.');
});

Il semble que je ne puisse même pas modifier la valeur du cookie ; je mets

res.cookie('user', {}, { signed: true, httpOnly: true, path: '/' })

dans mon parcours de déconnexion, mais la valeur du cookie reste inchangée.

20voto

Kevin Points 37

J'ai réalisé après un long et ennuyeux moment que mon frontal n'envoyait pas le cookie au point final où j'essayais d'effacer le cookie...

Sur le serveur :

function logout(req, res) {
  res.clearCookie('mlcl');
  return res.sendStatus(200);
}

Et sur la partie avant,

fetch('/logout', { method: 'POST', credentials: 'same-origin' })

L'ajout de "credentials : 'same-origin'" est ce qui a fait fonctionner le clearCookie pour moi. Si le cookie n'est pas envoyé, il n'a rien à effacer.

J'espère que cela vous aidera. J'aurais aimé trouver ça plus tôt...

6voto

Milan Velebit Points 680

D'après une recherche (approfondie) et une pensée aléatoire qui m'est venue à l'esprit, la réponse est d'utiliser les éléments suivants

res.clearCookie('<token_name>',{path:'/',domain:'<your domain name which is set in the cookie>'});

c'est-à-dire

    res.clearCookie('_random_cookie_name',{path:'/',domain:'.awesomedomain.co'}); 

Notez le . qui est spécifié dans le cookie, car nous l'utilisons pour les sous-domaines (vous pouvez également l'utiliser pour les sous-domaines sans le point, mais il est simplement plus sûr d'en utiliser un).

TLDR ; Vous devez fournir un domaine : également.

4voto

joshuakcockrell Points 964

Assurez-vous que vous envoyez vos informations d'identification pour qu'elles soient vérifiées.

Même si c'est seulement un /logout vous devez toujours envoyer des informations d'identification.

// FRONT END
let logOut = () => {

  fetch('logout', {
    method: 'get',
    credentials: 'include', // <--- YOU NEED THIS LINE
    redirect: "follow"
  }).then(res => {
    console.log(res);
  }).catch(err => {
    console.log(err);
  });

}

// BACK END
app.get('/logout', (req, res) => {
  res.clearCookie('token');
  return res.status(200).redirect('/login');
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X