Saisir une session existante lors du rechargement de page avec express / connect-redis

À l’aide de connect, express et socket.io, j’essaie de permettre à mon application de récupérer les détails de la session lors de la reconnexion. Mes sessions fonctionnent évidemment lorsque le client est connecté, mais si j’actualise la page de mon navigateur, tout est oublié.
Mon cookie de session est définitivement le même, alors ce n’est pas ça.

Mon code est un vaste mélange d’extraits de sources différentes, car il ne semble pas y avoir un exemple complet d’application. : – /

Qu’est-ce que je rate..?

var qs = require('queryssortingng'), express = require('express'), app = express.createServer(), io = require('socket.io').listen(app.listen(8000)), routes = require('./routes'), pCookie = require('connect').utils.parseCookie, Session = require('connect').middleware.session.Session, RedStore= require('connect-redis')(express), sStore = new RedStore(); // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.session({ store: sStore, secret: 'tehsecretz' })); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); // Routes app.get('/', routes.index); io.sockets.on('connection', function (client) { var hs = client.handshake, session = hs.session; console.log('A socket connected called: ' + hs.sessionId); var intervalId = setInterval(function() { hs.session.reload(function() { hs.session.touch().save(); }); }, 60 * 1000); if (!session.userName) { // Prompts the user for a name on the frontend client.emit('need-to-register'); } client.on('message', function(msg, c) { console.log(session); console.log(msg); }); client.on('register-user', function(data, fn) { // This resortingeves the user's name // and - hopefully - saves it to the session. data = qs.parse(data); session.userName = data.username; hs.session.save(); console.log('Saving: ', session); fn('ok'); }); client.on('disconnect', function() { clearInterval(intervalId); }); }); io.set('authorization', function (data, accept) { if (data.headers.cookie) { data.cookie = pCookie(data.headers.cookie); data.sessionId = data.cookie['connect.sid']; data.sessionStore = sStore; sStore.get(data.sessionId, function (err, session) { if (err || !session) { accept('Error', false); } else { console.log(data.sessionId, session); data.session = new Session(data, session); accept(null, true); } }); } else { return accept('No cookie transmitted', false); } }); 

Merci pour toute aide fournie!

Pouah. Ainsi, dans l’article de Daniel Baulig sur le sujet, il a fait référence à l’identificateur sessionID . Je pensais que c’était juste une mauvaise convention (comme je suis habitué à camelCase) et l’ai rapidement changé en sessionId dans mon code.

Pendant que je déboguais, j’ai allumé MONITOR ing sur mon instance redis et j’ai remarqué que la session était en train d’être écrite dans sess:undefined .

Il s’avère que sessionID est spécial et qu’il est référencé en interne comme identifiant réel. Changer toutes les instances de sessionId en sessionID me permet de mieux comprendre qui se connecte!

Ajouter ‘cookie’ dans “express.session”

 app.use(express.session({ secret: 'exampleSecretKey' ,store: exampleStore ,key: 'example' cookie: { path: '/' ,expires: false // Alive Until Browser Exits ,httpOnly: true // ,domain:'.example.com' } });