Sadece bir buçuk ay önce aynı problemle uğraştım ve daha sonra bu konu hakkında GitHub'da barındırılan tam olarak çalışan bir demo uygulamasıyla birlikte gelen kapsamlı bir blog yazısı yazdım . Çözüm , her şeyi bağlamak için express-session , cookie-parser ve connect-redis node modüllerine dayanır . Oldukça kullanışlı olan hem REST hem de Sockets bağlamından oturumlara erişmenize ve bunları değiştirmenize olanak tanır.
İki önemli bölüm ara yazılım kurulumudur:
app.use(cookieParser(config.sessionSecret));
app.use(session({
store: redisStore,
key: config.sessionCookieKey,
secret: config.sessionSecret,
resave: true,
saveUninitialized: true
}));
... ve SocketIO sunucu kurulumu:
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();
});
});
});
Yaptığım basit bir sessionService modülü ile birlikte gidiyorlar, bu da oturumlarla bazı temel işlemleri yapmanıza izin veriyor ve bu kod şuna benziyor:
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);
}
};
Her şeyde bundan daha fazla kod olduğundan (modülleri başlatmak, hem istemci hem de sunucu tarafında soketler ve REST çağrıları ile çalışmak gibi), tüm kodu buraya yapıştırmayacağım, GitHub'da görüntüleyebilirsiniz. ve onunla ne istersen yapabilirsin.
{ path: '/', _expires: null, originalMaxAge: null, httpOnly: true, secure: true } }
Ama benim rotalara oturumu yazdırmak eğer ben kurdum tüm oturum değişkenleri (kullanıcı adı, kimliği, vb ..) almak