Created
September 23, 2013 06:01
-
-
Save gbertb/6666912 to your computer and use it in GitHub Desktop.
socket.io + express + sessions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
}); | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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