Hace solo un mes y medio me enfrenté al mismo problema y luego escribí una extensa publicación de blog sobre este tema que va junto con una aplicación de demostración completamente funcional alojada en GitHub. La solución se basa en módulos de nodo express-session , cookie-parser y connect-redis para atar todo. Le permite acceder y modificar sesiones desde el contexto REST y Sockets, lo cual es bastante útil.
Las dos partes cruciales son la configuración del middleware:
app.use(cookieParser(config.sessionSecret));
app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true
}));
... y configuración del servidor SocketIO:
ioServer.use(function (socket, next) {
var parseCookie = cookieParser(config.sessionSecret);
var handshake = socket.request;
parseCookie(handshake, null, function (err, data) {
sessionService.get(handshake, function (err, session) {
if (err)
next(new Error(err.message));
if (!session)
next(new Error("Not authorized"));
handshake.session = session;
next();
});
});
});
Van junto con un módulo sessionService simple que hice que le permite hacer algunas operaciones básicas con sesiones y ese código se ve así:
var config = require('../config');
var redisClient = null;
var redisStore = null;
var self = module.exports = {
initializeRedis: function (client, store) {
redisClient = client;
redisStore = store;
},
getSessionId: function (handshake) {
return handshake.signedCookies[config.sessionCookieKey];
},
get: function (handshake, callback) {
var sessionId = self.getSessionId(handshake);
self.getSessionBySessionID(sessionId, function (err, session) {
if (err) callback(err);
if (callback != undefined)
callback(null, session);
});
},
getSessionBySessionID: function (sessionId, callback) {
redisStore.load(sessionId, function (err, session) {
if (err) callback(err);
if (callback != undefined)
callback(null, session);
});
},
getUserName: function (handshake, callback) {
self.get(handshake, function (err, session) {
if (err) callback(err);
if (session)
callback(null, session.userName);
else
callback(null);
});
},
updateSession: function (session, callback) {
try {
session.reload(function () {
session.touch().save();
callback(null, session);
});
}
catch (err) {
callback(err);
}
},
setSessionProperty: function (session, propertyName, propertyValue, callback) {
session[propertyName] = propertyValue;
self.updateSession(session, callback);
}
};
Dado que hay más código para todo esto (como inicializar módulos, trabajar con sockets y llamadas REST tanto en el lado del cliente como en el del servidor), no pegaré todo el código aquí, puedes verlo en GitHub. y puedes hacer lo que quieras con él.
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Pero si imprimo la sesión en mis rutas, obtengo todas las variables de sesión que configuré (nombre de usuario, identificación, etc.)