Created
February 9, 2012 22:53
-
-
Save jedp/1784039 to your computer and use it in GitHub Desktop.
ldap auth for express and socket.io
This file contains hidden or 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
// 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