Skip to content

Instantly share code, notes, and snippets.

@jedp
Created February 9, 2012 22:53
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jedp/1784039 to your computer and use it in GitHub Desktop.
Save jedp/1784039 to your computer and use it in GitHub Desktop.
ldap auth for express and socket.io
// express + socket.io example (chat server)
// that requires authentication via ldap.
// express shares authentication with socket.io.
var express = require('express');
var io = require('socket.io');
var ldap = require('./lib/node-ldapauth/ldapauth');
var sessionStore = new express.session.MemoryStore(); // whatever
var parseCookie = require('connect').utils.parseCookie;
var LDAP_HOST = 'ldap.example.com';
var LDAP_PORT = 389;
var SESSION_KEY = 'web-chat.sid';
var app = module.exports = express.createServer();
var people = {};
var buffer = [];
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.static(__dirname + '/public'));
app.use(express.logger({format: ':url :method :response-time ms :remote-addr :date'}));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session(
{'store': sessionStore,
'secret': "Attack at dawn!",
'key': SESSION_KEY}));
app.use(app.router);
});
app.get('/logout', function(req, res) {
req.session.destroy();
res.render('logout');
});
app.get('/login', function(req, res) {
res.render('login');
});
app.post('/login', function(req, res) {
var username = req.body.username;
var password = req.body.password;
ldap.authenticate(LDAP_HOST, LDAP_PORT, username+'@DOMAIN', password, function(err, success) {
if (username && password && success) {
req.session.username = username;
return res.redirect(req.body.next || '/');
} else {
return res.redirect("back");
}
});
});
app.get('/', loginRequired, function(req, res){
res.render('index', {
buffer: buffer
});
});
function loginRequired(req, res, next) {
if (req.session && req.session.username) {
next();
} else {
res.redirect('/login?next=' + req.url);
}
}
if (!module.parent) {
app.listen(3001);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
}
// ---------------------------------------------------------
// The socket.io half
var io = io.listen(app);
io.set('authorization', function(data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionID = data.cookie[SESSION_KEY];
console.log("got here");
console.log(data);
sessionStore.get(data.sessionID, function(err, session) {
if (err) {
accept(err.message, false);
} else {
data.session = session;
accept(null, true);
}
});
} else {
return accept('No session cookie', false);
}
});
io.sockets.on('connection', function(socket) {
var username = socket.handshake.session.username;
socket.json.send({buffer: buffer});
socket.broadcast.json.send({announce: username + ' has joined the room'});
socket.on('message', function(message) {
var msg = {from:username, text:message};
buffer.push(msg);
if (buffer.length > 50) buffer.shift();
socket.broadcast.json.send(msg);
socket.json.send(msg);
});
socket.on('disconnect', function() {
socket.broadcast.send({announce: username + ' has left the room'});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment