How to share sessions with Socket.IO 1.x and Express 4.x?

后端 未结 6 1118
轮回少年
轮回少年 2020-11-22 15:14

How can I share a session with Socket.io 1.0 and Express 4.x? I use a Redis Store, but I believe it should not matter. I know I have to use a middleware to look at cookies a

6条回答
  •  旧巷少年郎
    2020-11-22 15:32

    I have kinda solved it, but it is not perfect. Does not support signed cookies etc. I used express-session 's getcookie function. The modified function is as follows:

        io.use(function(socket, next) {
            var cookie = require("cookie");
            var signature = require('cookie-signature');
            var debug = function() {};
            var deprecate = function() {};
    
            function getcookie(req, name, secret) {
                var header = req.headers.cookie;
                var raw;
                var val;
    
                // read from cookie header
                if (header) {
                    var cookies = cookie.parse(header);
    
                    raw = cookies[name];
    
                    if (raw) {
                        if (raw.substr(0, 2) === 's:') {
                            val = signature.unsign(raw.slice(2), secret);
    
                            if (val === false) {
                                debug('cookie signature invalid');
                                val = undefined;
                            }
                        } else {
                            debug('cookie unsigned')
                        }
                    }
                }
    
                // back-compat read from cookieParser() signedCookies data
                if (!val && req.signedCookies) {
                    val = req.signedCookies[name];
    
                    if (val) {
                        deprecate('cookie should be available in req.headers.cookie');
                    }
                }
    
                // back-compat read from cookieParser() cookies data
                if (!val && req.cookies) {
                    raw = req.cookies[name];
    
                    if (raw) {
                        if (raw.substr(0, 2) === 's:') {
                            val = signature.unsign(raw.slice(2), secret);
    
                            if (val) {
                                deprecate('cookie should be available in req.headers.cookie');
                            }
    
                            if (val === false) {
                                debug('cookie signature invalid');
                                val = undefined;
                            }
                        } else {
                            debug('cookie unsigned')
                        }
                    }
                }
    
                return val;
            }
    
            var handshake = socket.handshake;
            if (handshake.headers.cookie) {
                var req = {};
                req.headers = {};
                req.headers.cookie = handshake.headers.cookie;
                var sessionId = getcookie(req, "connect.sid", mysecret);
                console.log(sessionId);
                myStore.get(sessionId, function(err, sess) {
                    console.log(err);
                    console.log(sess);
                    if (!sess) {
                        next(new Error("No session"));
                    } else {
                        console.log(sess);
                        socket.session = sess;
                        next();
                    }
                });
            } else {
                next(new Error("Not even a cookie found"));
            }
        });
    
        // Session backend config
        var RedisStore = connectRedis(expressSession);
        var myStore = new RedisStore({
            client: redisClient
        });
        var session = expressSession({
            store: myStore,
            secret: mysecret,
            saveUninitialized: true,
            resave: true
        });
        app.use(session);
    

提交回复
热议问题