Comment fonctionnent les sessions dans Express.js avec noeud.js?
Par Express.js , les sessions sont très simples. Je suis curieux de savoir comment ils fonctionnent bien.
est-ce qu'il stocke des cookies sur le client? Si oui, où puis-je trouver ce biscuit? Si nécessaire, comment le décoder?
je veux essentiellement être en mesure de voir si un utilisateur est connecté, même si l'utilisateur n'est pas réellement sur le site à ce moment-là (comme comment facebook sait que vous êtes connecté lorsque vous êtes sur d'autres sites). Mais je suppose que pour comprendre que je devrais d'abord comprendre comment les sessions fonctionnent.
3 réponses
Je n'ai jamais utilisé L'Express.js, bien que selon leur documentation sur le sujet, il ressemble à:
-
les Cookies sont stockés sur le client, avec une clé (que le serveur utilisera pour récupérer les données de la session) et un hachage (que le serveur utilisera pour s'assurer que les données du cookie n'ont pas été altérées, donc si vous essayez de changer une valeur le cookie sera invalide)
-
les données de La session, contrairement à certains cadres (par exemple, Jouer "Cadre de 151940920" !) est tenu sur le serveur, de sorte que le cookie ressemble plus à un conteneur 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 sont par défaut conservées en mémoire, bien que cela puisse être modifié à n'importe quelle forme de stockage implémente L'API appropriée.
donc si vous voulez vérifier des choses sans objet spécifique de requête req
, comme vous l'avez dit, vous devez juste accéder à ce même stockage. En bas de la première page de documentation, il détaille les méthodes que le stockage doit implémenter, donc si vous êtes familier avec votre API de stockage, peut-être pourriez-vous exécuter un .getAll()
si quelque chose comme ça existe, et boucler les données de session et lire les valeurs que vous voulez.
vue d'ensemble
Express.js utilise un cookie pour stocker un identifiant de session (avec une signature cryptée) dans le navigateur de l'utilisateur et ensuite, sur les requêtes ultérieures, 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 stockage de mémoire (par défaut) ou tout autre stockage qui implémente les méthodes requises (comme connect-redis ).
détails
Express.js / Connect crée une chaîne de caractères de 24 caractères Base64 en utilisant utils.uid(24)
et la stocke dans req.sessionID
. Cette chaîne est ensuite utilisée comme valeur dans un cookie.
Côté Client
cookies signés sont toujours utilisés pour les sessions, de sorte que la valeur de cookie aura le format suivant.
[sid].[signature]
où [sid] est le sessionID et [signature] est générée en signant [sid] en utilisant clé secrète fournie lors de l'initialisation de l'middleware de session. L'étape de signature est faite pour empêcher l'altération. Il devrait être impossible sur le plan informatique 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].
le nom de ce cookie est
connect.sid
Côté Serveur
si un handler se produit après les middlewares cookieParser
et session
il aura accès à la variable req.cookies
. Il contient un objet JSON dont les clés sont les clés des cookies et les valeurs sont les valeurs des cookies. Cette clé contiendra une clé nommée connect.sid
et sa valeur sera l'Identificateur de session signé.
voici un exemple pour configurer une route qui vérifiera l'existence du cookie de session sur chaque requête 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 devez également vous assurer que le routeur ( app.use(app.router)
) est inclus APRÈS cookieParser
et session
dans votre section de configuration.
ce qui suit est un exemple des données stockées en interne par Express.js/se Connecter.
{
"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 de session.
l'exemple est tiré de L'Express 2.5.
je suis curieux de savoir comment ils fonctionnent.
Essayez de regarder ce réponse et wiki choses".
est-ce qu'il stocke des cookies sur le client?
Oui, il s'agit généralement d'un cookie avec un identifiant de session assigné, qui doit être signé avec un secret afin d'éviter toute falsification.
si alors, où puis-je trouver ce biscuit? Si nécessaire, comment le décoder?
vous ne devriez pas déconner avec un cookie de session du côté du client. Si vous voulez travailler avec des sessions du côté du serveur, vous devriez consulter express.js et se connecter docs.