web-dev-qa-db-fra.com

Comment fonctionnent les sessions dans Express.js avec Node.js?

En utilisant Express.js , les sessions sont très simples. Je suis curieux de savoir comment ils fonctionnent réellement.

Stocke-t-il des cookies sur le client? Si oui, où puis-je trouver ce cookie? Si nécessaire, comment le décoder?

Je veux essentiellement pouvoir voir si un utilisateur est connecté, même lorsque l'utilisateur n'est pas réellement sur le site à l'époque (comme la façon dont Facebook sait que vous êtes connecté lorsque vous êtes sur d'autres sites). Mais je suppose que je dois d'abord comprendre comment fonctionnent les sessions.

92
foobar

Je n'ai jamais utilisé Express.js, bien que selon leur documentation sur le sujet, cela ressemble à:

  • Les cookies sont stockés sur le client, avec une clé (que le serveur utilisera pour récupérer les données de session) et un hachage (que le serveur utilisera pour s'assurer que les données des cookies n'ont pas été falsifiées, donc si vous essayez de changer une valeur le cookie sera invalide)

  • Les données de session, contrairement à certains frameworks (par exemple Play Framework !) Sont conservées sur le serveur, donc le cookie ressemble plus à un espace réservé pour la session qu'à un détenteur de données de session réelles.

  • De ici , il semble que ces données de session sur le serveur soient par défaut conservées en mémoire, bien que cela puisse être modifié en quelque forme de stockage qui implémente l'API appropriée.

Donc, si vous voulez vérifier des choses sans un objet de requête req spécifique, comme vous l'avez dit, vous devez simplement accéder à ce même stockage. Au bas de la première page de documentation, il détaille les méthodes requises que le stockage doit implémenter, donc si vous êtes familier avec votre API de stockage, vous pourriez peut-être exécuter une .getAll() si quelque chose comme ça existe, et boucler à travers les données de session et lire les valeurs que vous voulez.

38
davin

Présentation

Express.js utilise un cookie pour stocker un identifiant de session (avec une signature de chiffrement) dans le navigateur de l'utilisateur, puis, lors des requêtes suivantes, utilise la valeur de ce cookie pour récupérer les informations de session stockées sur le serveur. Ce stockage côté serveur peut être un magasin de mémoire (par défaut) ou tout autre magasin qui implémente les méthodes requises (comme connect-redis ).

Détails

Express.js/Connect crée une chaîne de 24 caractères Base64 à l'aide de utils.uid(24) et la stocke dans req.sessionID. Cette chaîne est ensuite utilisée comme valeur dans un cookie.

Côté client

Les cookies signés sont toujours utilisés pour les sessions, donc la valeur du cookie aura le format suivant.

[sid].[signature]

Où [sid] est l'ID de session et [signature] est généré en signant [sid] à l'aide de la clé secrète fournie lors de l'initialisation du middleware de session. L'étape de signature est effectuée pour empêcher la falsification. Il devrait être impossible de modifier [sid], puis de recréer [signature] sans connaître la clé secrète utilisée. Le cookie de session est toujours vulnérable au vol et à la réutilisation, si aucune modification de [sid] n'est requise.

Le nom de ce cookie est

connect.sid

Du côté serveur

Si un gestionnaire se produit après le middleware cookieParser et session, il aura accès à la variable req.cookies. Il contient un objet JSON dont les clés sont les clés de cookie et les valeurs sont les valeurs de cookie. Celui-ci contiendra une clé nommée connect.sid Et sa valeur sera l'identifiant de session signé.

Voici un exemple de configuration d'un itinéraire qui vérifiera l'existence du cookie de session sur chaque demande et imprimera sa valeur sur la console.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

Vous devrez également vous assurer que le routeur (app.use(app.router)) est inclus après cookieParser et session dans votre section de configuration.

Voici un exemple des données stockées en interne par Express.js/Connect.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

Le champ user est personnalisé. Tout le reste fait partie de la gestion des sessions.

L'exemple provient d'Express 2.5.

153
Waylon Flinn

Je suis curieux de savoir comment ils fonctionnent réellement.

Essayez de regarder this answer et wiki stuff.

Stocke-t-il des cookies sur le client?

Oui, il s'agit généralement d'un cookie avec un ID de session attribué, qui doit être signé avec un secret afin d'éviter la contrefaçon.

Si oui, où puis-je trouver ce cookie? Si nécessaire, comment le décoder?

Vous ne devriez pas jouer avec un cookie de session côté client. Si vous souhaitez travailler avec des sessions côté serveur, vous devriez consulter les documents liés express.js et connect .

8
yojimbo87