Comment puis-je partager une session avec Socket.io 1.0 et Express 4.x? J'utilise un magasin Redis, mais je pense que cela ne devrait pas avoir d'importance. Je sais que je dois utiliser un middleware pour regarder les cookies et récupérer la session, mais je ne sais pas comment. J'ai cherché mais je n'ai trouvé aucun travail
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Mais si j'imprime la session dans mes routes, j'obtiens toutes les variables de session que j'ai configurées (nom d'utilisateur, id, etc.)Il y a à peine un mois et demi, j'ai traité le même problème et j'ai ensuite écrit un article de blog complet sur ce sujet qui va de pair avec une application de démonstration entièrement fonctionnelle hébergée sur GitHub. La solution repose sur des modules de nœud express-session , cookie-parser et connect-redis pour tout lier. Il vous permet d'accéder et de modifier des sessions à la fois depuis le contexte REST et Sockets, ce qui est très utile.
Les deux parties cruciales sont la configuration du middleware:
... et configuration du serveur SocketIO:
Ils vont avec un simple module sessionService que j'ai créé qui vous permet d'effectuer des opérations de base avec des sessions et ce code ressemble à ceci:
Puisqu'il y a plus de code dans l'ensemble que cela (comme l'initialisation des modules, le travail avec les sockets et les appels REST à la fois du côté client et du côté serveur), je ne vais pas coller tout le code ici, vous pouvez le voir sur le GitHub et vous pouvez en faire ce que vous voulez.
la source
express-socket.io-session
est une solution toute faite à votre problème. Normalement, la session créée à la fin de socket.io a un sid différent de ceux créés dans express.js
Avant de savoir ce fait, quand je travaillais dessus pour trouver la solution, j'ai trouvé quelque chose d'un peu bizarre. Les sessions créées à partir de l'instance express.js étaient accessibles à la fin de socket.io, mais la même chose n'était pas possible pour le contraire. Et bientôt, j'ai appris que je devais travailler mon chemin dans la gestion de Sid pour résoudre ce problème. Mais, il y avait déjà un paquet écrit pour s'attaquer à ce problème. Il est bien documenté et fait le travail. J'espère que ça aide
la source
En utilisant la réponse de Bradley Lederholz, voici comment je l'ai fait fonctionner pour moi-même. Veuillez vous référer à la réponse de Bradley Lederholz, pour plus d'explications.
la source
Je l'ai un peu résolu, mais ce n'est pas parfait. Ne prend pas en charge les cookies signés, etc. J'ai utilisé la fonction getcookie de express-session . La fonction modifiée est la suivante:
la source
Maintenant, la réponse originale acceptée ne fonctionne pas non plus pour moi. Identique à @ Rahil051, j'ai utilisé le module express-socket.io-session , et cela fonctionne toujours. Ce module utilise un analyseur de cookies pour analyser l'ID de session avant d'entrer dans le middleware de session express. Je pense que la réponse de @pootzko, @Mustafa et @ Kosar est silencieuse.
J'utilise ces modules:
vérifiez les données dans socket.handshake:
la source