Skip to content

Instantly share code, notes, and snippets.

@gbertb
Created September 23, 2013 06:01
Show Gist options
  • Save gbertb/6666912 to your computer and use it in GitHub Desktop.
Save gbertb/6666912 to your computer and use it in GitHub Desktop.
socket.io + express + sessions
{
"name": "soup_realtime",
"version": "0.1.0",
"description": "realtime server",
"main": "realtime-server.js",
"scripts": {
"test": "echo \"Error: no test specified! Configure in package.json\" && exit 1"
},
"repository": "",
"dependencies": {
"socket.io-client": "*",
"socket.io": "*",
"express": "*",
"request": "*",
"xmlhttprequest": "*",
"connect": "*",
"session.socket.io": "*"
},
"keywords": [],
"author": "redism",
"license": "MIT",
"readmeFilename": "README.md"
}
var util = require('util');
var sio = require('socket.io-client');
var request = require('request');
// The code below is borrowed from the gist below.
// https://gist.github.com/jfromaniello/4087861
//
// Make socket.io client work with login cookie so that authentication
// can work with socket.io client and request.
var j = request.jar();
var originalRequest = require('xmlhttprequest').XMLHttpRequest;
require('socket.io-client/node_modules/xmlhttprequest').XMLHttpRequest = function() {
originalRequest.apply(this, arguments);
this.setDisableHeaderCheck(true);
var stdOpen = this.open;
// I will patch now open in order to set my cookie from the jar request.
this.open = function() {
stdOpen.apply(this, arguments);
var header = j.get({
url: 'http://localhost:9000'
}).map(function(c) {
return c.name + "=" + c.value;
}).join("; ");
this.setRequestHeader('cookie', header);
};
};
request.post({
uri: 'http://localhost:1337/login',
jar: j,
form: {
un: 'redism',
pw: '1234'
}
}, function(err, res, body) {
if (res.statusCode == 403) {
console.log('Login : Authentication failed!');
} else if (res.statusCode == 200) {
console.log('Connecting to RT server');
connectToRTServer();
}
});
function connectToRTServer() {
var socket = sio.connect('http://localhost:1337');
socket.on('connect', function() {
console.log('connected!');
});
socket.on('connect_failed', function(reason) {
console.log('connection failed : ' + reason);
});
socket.on('disconnect', function(obj) {
util.inspect(obj);
console.log('disconnected!');
});
socket.on('error', function(err, reason) {
if (err === 'handshake error') {
console.log('Error : Authorization failed');
} else {
console.log('Error : ' + err);
}
});
socket.on('news', function(data) {
console.log(data);
});
socket.on('announcement', function(data) {
console.log('Announcement from the server : ' + data);
});
};
var sio = require('socket.io'),
express = require('express'),
http = require('http'),
connect = require('connect'),
app = express(),
server = http.createServer(app);
var util = require('util');
var cookieParser = express.cookieParser('secret'),
sessionStore = new connect.middleware.session.MemoryStore();
app.configure(function() {
app.use(cookieParser);
app.use(express.bodyParser());
app.use(express.session({
store: sessionStore
}));
});
function checkAuth(req, res, next) {
if (!req.session.user_id) {
res.send('You are not authorized to connect to this server');
} else {
next();
}
};
app.post('/login', function(req, res) {
var post = req.body;
if (post.un == 'redism' && post.pw == '1234') {
req.session.user_id = 'redism';
res.send('Done');
} else {
res.send('Bad user/pw', 403);
}
});
server.listen(1337);
//var io = sio.listen(server, {resource: '/realtime'});
var io = sio.listen(server);
var SessionSockets = require('session.socket.io'),
sessionSockets = new SessionSockets(io, sessionStore, cookieParser);
function parseSessionCookie(cookie, sid, secret) {
var cookies = require('express/node_modules/cookie').parse(cookie),
parsed = require('express/node_modules/connect/lib/utils').parseSignedCookies(
cookies, secret);
return parsed[sid] || null;
}
io.configure(function() {
// Setup socket.io authorization using express cookie.
// To succeed authorization, client must first perform login
// using POST to /login uri.
io.set('authorization ', function(data, callback) {
if (data.headers.cookie) {
var sid = parseSessionCookie(data.headers.cookie,
'connect.sid', 'secret');
console.log(sid);
callback(null, true);
} else {
callback('Authorization required', false);
}
});
});
sessionSockets.on('connection', function(err, socket, session) {
console.log('connection established.');
io.sockets.emit('announcement', 'connected ');
socket.on('user message', function(msg) {
io.sockets.emit('user message', msg);
});
setInterval(function() {
socket.emit('announcement', 'hello');
}, 1000);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment