Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I access cookie-session middleware in socket.io on NodeJS?

I decided to use socket.io in my application and stumbled upon a problem. I use cookie-session for express authorization:

var session = require('cookie-session');
var app = express();
// ...
app.use(session({
  keys: ['secretkey1', 'secretkey2']
}))
// ...
app.get('/settings', function(req, res) {
    res.type("html");

    if (!req.session.sid)    {
        console.log("NO SID");
        req.session.sid = util.randomString();
    }
    else {
        console.log("sid:" + req.session.sid);
    }

    // doing stuff with req.session.sid

    var jadeView = { /*...*/ };
    res.status(200).send(mainJade(jadeView));
});

Now I use socket.io. I figured out how to access cookies:

io.sockets.on('connection', function(socket) {
    var cookie_string = socket.request.headers.cookie;
    console.log("cookies: " + cookie_string);
// ...
}

But how do I convert cookie_string to session object, like in req.session?

like image 420
rmflow Avatar asked Apr 10 '26 22:04

rmflow


2 Answers

What changed

@rmflow's answer from 2014 does not seem to work in 2017 with socket.io-client 2.0.2 and cookie-session 2.0.0

Apparently, the cookies package (the main dependency of cookie-session) expects somewhat different request and response objects. Namely, the request object should have a connection object with a boolean encrypted property; in addition, the response object is expected to have getHeader and setHeader methods.

Updated solution

const session = require('cookie-session')({
    name: 'some-session-name',
    secret: 'some-session-secret', // or an array of keys as usual
    ... // Other relevant options
});

io.on('connection', socket => {
    let cookieString = socket.request.headers.cookie;

    let req = {connection: {encrypted: false}, headers: {cookie: cookieString}}
    let res = {getHeader: () =>{}, setHeader: () => {}};
    //
    session(req, res, () => {
        console.log(req.session); // Do something with req.session
    })
})
like image 64
Boaz Avatar answered Apr 13 '26 11:04

Boaz


Figured out myself:

var req = { headers : {cookie : cookie_string} }
session({ keys: ['secretkey1', 'secretkey2'] })(req, {}, function(){})
console.log(req.session.sid);
like image 28
rmflow Avatar answered Apr 13 '26 13:04

rmflow



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!