web-dev-qa-db-fra.com

Comment le passeport js stocke-t-il l'objet utilisateur en session?

J'utilise node/express avec passeport dans mon développement. Je suis tombé sur un article qui dit:

Express charge les données de session et les attache à la demande. Comme le passeport stocke l'utilisateur sérialisé dans la session, l'objet utilisateur sérialisé peut être trouvé sur req.session.passport.user.

Mais à ma grande surprise, la valeur des magasins sessionID dans les cookies du navigateur reste la même avant et après la connexion. Alors, où l'objet utilisateur sérialisé est-il stocké?

Je pensais qu'il était initialement stocké dans le cookie utilisateur sessionid mais il semble que ce ne soit pas le cas car je peux toujours accéder à mon objet utilisateur avec req.session.passport.user

19
desmondlee

Alors, où l'objet utilisateur sérialisé est-il stocké?

En bref

L'objet utilisateur sérialisé est stocké dans req.user par PassportJS extrait de req.session.passport.user (qui est rempli par Express) à l'aide de Passport'sdeserializeUser méthode.

Express ajoute l'identifiant de l'objet session dans un cookie sur le navigateur de l'utilisateur, qui est renvoyé pour être exprimé dans un en-tête à chaque demande. Express prend ensuite l'ID de l'en-tête et recherche le magasin de session (c'est-à-dire Mongo ou autre) et trouve l'entrée et la charge dans req.session.

PassportJS utilise le contenu de req.session pour suivre l'utilisateur authentifié à l'aide des méthodes serializeUser et deserializeUser (pour plus d'informations sur le workflow de serializeUser et deserializeUser voir ma réponse dans ce SO question ).

Express est responsable de la création de la session. quand les sessions sont-elles créées? C'est alors que Express ne détecte pas de cookie de session. Ainsi, l'ordre dans lequel vous organisez vos configurations session et passport dans vos app ou server.js le fichier est très important. Si vous déclarez vos configurations session et passport ci-dessus static directory configs puis toutes les demandes de static content obtiendra également une session, ce qui n'est pas bon.

Voir ma réponse à cela SO question , où j'ai mentionné l'accès au contenu statique ainsi que la façon d'appliquer sélectivement passport à certains itinéraires, plutôt que la valeur par défaut (vous n'aurez peut-être pas besoin d'authentifier toutes les routes - par conséquent, vous pourriez éviter les session store lookup et de-serialization en attachant la session uniquement aux demandes mappant vers des URL sécurisées (voir ci-dessous).

//selectively applying passport to only secure urls
app.use(function(req, res, next){
  if(req.url.match('/xxxx/secure'))
    passport.session()(req, res, next)
  else
    next(); // do not invoke passport
});

Il y a un incroyable tutoriel que je vous recommande fortement de lire si vous voulez comprendre le flux de travail de PassportJS.

33
Raf

Vous pouvez regarder le sessionID dans le cookie comme clé d'une base de données où les données de session sont stockées. Selon le gestionnaire de session que vous utilisez avec express et la politique de stockage que vous utilisez, les données seront stockées de différentes manières. Cela signifie que l'ID session peut avoir la même valeur avant la connexion, après une connexion réussie et même après la déconnexion d'un utilisateur.

Si vous utilisez express-session avec MemoryStore les données seront enregistrées dans la mémoire du processus de noeud, indexées sur l'ID de session. Recherchez ici initialisation du magasin et ici stockage des données.

Vous pouvez créer un magasin dans lequel les données sont sérialisées dans le cookie, mais aucun de ceux-ci n'est répertorié dans magasins de session compatibles .

2
bolav