I'm using WebSockets npm install ws
on the same port as Express is running.
I'd like to pick up the associated 'sessionID' from the HTTP connection which had just been made and upgraded to a WebSocket.
// start express listening
server.listen(conf.server.port, conf.server.host);
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({server: server});
wss.on('connection', function(ws) {
var sessionID = // how do I get this?
ws.on('message', function(message) {
console.log('received: %s', message);
});
ws.send('something');
});
How can this be done?
(I currently work around the issue by sending the sessionID in the page, but this is ugly.)
To get session id we need to make some changes into SockJS library. And if we need to know session id before calling connect method we can modify SockJS' constructor and connect method to use client-passed value.
WebSocket endpoints for Express applications. Lets you define WebSocket endpoints like any other type of route, and applies regular Express middleware. The WebSocket support is implemented with the help of the ws library.
Get session data
var express = require('express');
var parseCookie = express.cookieParser();
var MemoryStore = express.session.MemoryStore;
var store = new MemoryStore();
app.configure(function() {
app.use(express.session({ store: store, secret: '123456', key: 'sid' }));
});
wss.on('connection', function(ws) {
parseCookie(ws.upgradeReq, null, function(err) {
var sessionID = ws.upgradeReq.cookies['sid'];
store.get(sessionID, function(err, session) {
// session
});
});
ws.on('message', function(message) {
console.log('received: %s', message);
});
ws.send('something');
});
This was a nightmare, finally got it working for myself using signed cookies!
Set up your store (example memory store):
var MemoryStore = express.session.MemoryStore;
store = new MemoryStore();
Expose parseCookie as global (if you need it in other modules) like this in app / server js files:
app.use(parseCookie = express.cookieParser('secret'));
Now set up sockets:
//this method gets called later
var ensureAuthenticatedSocket = function(handshake, callback) {
cookie = cookieParser(handshake, null, function(err) {
var sessionID = handshake.signedCookies['sid'];
store.get(sessionID, function(err, session) {
callback(err, session);
});
});
};
//listen time
io = io.listen(server);
//configure authentication
io.configure(function() {
io.set('authorization', function(handshake, callback) {
//call the method with handshake as parameter, wait for callback
ensureAuthenticatedSocket(handshake, function(err, session) {
if (!err && session) {
//no error + found session = wicked!
callback(null, true);
} else {
callback(null, false);
}
});
});
});
...
//more socket code
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With