Comment terminer une session dans ExpressJS

88

J'ai l'impression que cela doit être enterré quelque part dans la documentation, mais je ne peux pas le trouver.

Comment fermer ou terminer ou tuer (peu importe) une session dans ExpressJS?

Stephen
la source

Réponses:

121

Réponse mise à jour d'Express 4.x

La gestion des sessions n'est plus intégrée à Express. Cette réponse fait référence au module de session standard: https://github.com/expressjs/session

Pour effacer les données de session, utilisez simplement:

req.session.destroy();

La documentation est un peu inutile à ce sujet. Ça dit:

Détruit la session, supprimant req.session, sera re-généré la prochaine demande. req.session.destroy(function(err) { // cannot access session here })

Cela ne signifie pas que la session en cours sera rechargée à la prochaine demande. Cela signifie qu'une session vide propre sera créée dans votre magasin de sessions à la prochaine demande. (Vraisemblablement, l'ID de session ne change pas, mais je ne l'ai pas testé.)

Brad
la source
existe-t-il un moyen de détruire la session des sessions et non de la demande immédiate. Par exemple, si je devais implémenter la déconnexion de toutes les fonctionnalités des appareils, j'en aurais besoin
Muhammad Umer
1
@MuhammadUmer Autant que je sache, il n'y a pas de mécanisme intégré pour détruire une session arbitraire. Vous pouvez l'implémenter vous-même facilement en supprimant les clés associées à la session du stockage ou en créant votre propre wrapper de session.
Brad
92

Peu importe, c'est req.session.destroy();

Stephen
la source
8
Cela ne fonctionne pas pour moi sur express 3. J'essaye d'appeler ´req.session.destroy () ´
acidghost
6
Fonctionne bien pour moi sur ExpressJS 3.00. Utilisé req.session.destroy();comme l'a fait acidghost.
hexacyanide
1
l'utilisation de req.session.destroy () fonctionne aussi pour moi dans express 2.5
TulioPa
1
Où est-ce documenté? J'essaye de le trouver.
huggie
24

La question ne clarifiait pas le type de magasin de sessions utilisé. Les deux réponses semblent correctes.

Pour les sessions basées sur les cookies:

Depuis http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Pour les sessions basées sur Redis, etc.:

req.session.destroy // Deletes the session in the database.
Chemises blues
la source
1
req.session.destroy est essentiellement un wrapper pour "delete req.session", voir le code source ici: github.com/expressjs/session/blob/master/session/session.js
tfmontague
6

utilisation,

delete req.session.yoursessionname;
Nithin
la source
J'aimerais vraiment voir un document à ce sujet.
Lazy
5
Pour tous ceux qui votent à la baisse @Nithin; la méthode-fonction session.destroy () telle que documentée sur github (github.com/expressjs/session/blob/master/session/session.js) utilise "delete this.req.session" - ce n'est pas exactement la réponse de @ Nithin, mais l'utilisation de «supprimer» est également une solution correcte (et non traitée dans d'autres réponses).
tfmontague
Est-ce que c'est la bonne solution? Pas de fuite de mémoire, quoi que ce soit de malicieux n'arrivera pas?
Rajath
5

L'utilisation de req.session = null;, ne supprimera pas réellement l'instance de session. La solution la plus appropriée serait req.session.destroy();, mais il s'agit essentiellement d'un wrapper pour delete req.session;.

https://github.com/expressjs/session/blob/master/session/session.js

Session.prototype.destroy = function(fn){
  delete this.req.session;
  this.req.sessionStore.destroy(this.id, fn);
  return this;
};
tfmontague
la source
4

Session.destroy (rappel)

Détruit la session et annulera la propriété req.session. Une fois terminé, le rappel sera appelé.

↓ Voie sécurisée ↓ ✅

req.session.destroy((err) => {
  res.redirect('/') // will always fire after session is destroyed
})

Manière non sécurisée ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done
Hasan Sefa Ozalp
la source
0
req.session.destroy(); 

Ce qui précède n'a pas fonctionné pour moi, alors je l'ai fait.

req.session.cookie.expires = new Date().getTime();

En définissant l'expiration du cookie sur l'heure actuelle, la session a expiré d'elle-même.

John Quasar
la source
-5

Comme mentionné à plusieurs endroits, je ne parviens pas non plus à faire fonctionner correctement la fonction req.session.destroy ().

C'est mon travail ... semble faire l'affaire, et permet toujours d'utiliser req.flash

req.session = {};

Si vous supprimez ou définissez req.session = null; , il semble que vous ne puissiez pas utiliser req.flash

Gene Bo
la source
1
Ceci est un problème de sécurité, car il ne modifie pas le hachage de session
Tosh