From 1c75b590f0144700f18e926acb9d5700e21013ad Mon Sep 17 00:00:00 2001 From: nicompte Date: Tue, 27 Sep 2011 20:58:06 +0000 Subject: [PATCH] Gestion sessions avec websocket --- public/scripts/belote.js | 2 +- views/login.jade | 10 +++++ views/stackoverflow/layout.jade | 14 +++--- web.js | 79 ++++++++++++++++++++++++--------- 4 files changed, 76 insertions(+), 29 deletions(-) create mode 100644 views/login.jade diff --git a/public/scripts/belote.js b/public/scripts/belote.js index afcd390..e5200c0 100644 --- a/public/scripts/belote.js +++ b/public/scripts/belote.js @@ -1,4 +1,4 @@ -var socket = io.connect('http://cosson-games.nicompte.c9.io/belote'); +var socket = io.connect('http://cosson-games.nicompte.c9.io'); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data' }); diff --git a/views/login.jade b/views/login.jade new file mode 100644 index 0000000..dc4b2ae --- /dev/null +++ b/views/login.jade @@ -0,0 +1,10 @@ +h2 Login +form(method='post', action='/login') + div + label Login + input(name='username', type='text') + div + label Password + input(name='password', type='password') + div + input(type='submit', value='Login') \ No newline at end of file diff --git a/views/stackoverflow/layout.jade b/views/stackoverflow/layout.jade index 446ace6..0657f98 100644 --- a/views/stackoverflow/layout.jade +++ b/views/stackoverflow/layout.jade @@ -1,10 +1,10 @@ !!!5 html(lang = 'en') - head - title = title - link(rel = "stylesheet", type = "text/css", href = "/stylesheets/stackoverflow.css") - script(type = 'text/javascript', src = '/socket.io/socket.io.js') - script(type = 'text/javascript', src = '/scripts/mootools-core-1.4.0-full-nocompat.js') - script(type = 'text/javascript' + head + title = title + link(rel = "stylesheet", type = "text/css", href = "/stylesheets/stackoverflow.css") + script(type = 'text/javascript', src = '/socket.io/socket.io.js') + script(type = 'text/javascript', src = '/scripts/mootools-core-1.4.0-full-nocompat.js') + script(type = 'text/javascript' src = '/scripts/belote.js') - body!= body \ No newline at end of file + body!= body \ No newline at end of file diff --git a/web.js b/web.js index b493d54..fce6f56 100644 --- a/web.js +++ b/web.js @@ -3,45 +3,40 @@ express = require("express"), stylus = require("stylus"), io = require("socket.io"), connections = {}; -//const parseCookie = require('connect').utils.parseCookie; - +parseCookie = require('connect').utils.parseCookie; //var deckModel = require("./models/Deck.js").Deck(); - //var deck = new deckModel(32); var app = express.createServer(), io = io.listen(app); app.configure(function() { - app.set ('view engine', 'jade'); - app.use( stylus.middleware({ + this.set ('view engine', 'jade'); + this.use( stylus.middleware({ src: __dirname + "/views", dest: __dirname + "/public", compress: true })); - /* + this.use(express.bodyParser()); + this.use(express.cookieParser()); this.sessionStore = new express.session.MemoryStore({ reapInterval: 60000 * 10 }); this.use(express.session({ - "secret": "some private string", - "store": this.sessionStore + secret: "Cosson forever", + key: "express.sid", + sessionStore: this.sessionStore })); - */ - app.use (express.static(__dirname + '/public')); + this.use(express.static(__dirname + '/public')); }); -/* Middleware for limited access */ -/* function requireLogin (req, res, next) { if (req.session.username) { next(); } else { - res.redirect("/"); + res.redirect("/login"); } } -*/ - -/* Home page (requires authentication) */ -app.get('/secured', /*[requireLogin],*/ function (req, res/*, next*/) { + +app.get('/secured', [requireLogin], function (req, res, next) { res.send('Accès sécurisé'); }); @@ -49,9 +44,25 @@ app.get('/', function(req, res){ res.send('Vive Nico'); }); -app.get('/belote/:template', function(req, res){ +app.get('/belote/:template', [requireLogin], function(req, res){ res.render(req.params.template+'/index', { title: 'Cosson games' }); }); + +app.get('/login', function(req, res){ + res.render('login', { title: 'Login' }); +}); + +app.post('/login', function(req, res){ + if(!req.body.username || !req.body.password){ + res.render('login', { title: 'Login', error: 'Please enter login information' }); + }else{ + if(req.body.username == 'nbarbotte' && req.body.password == 'mdp'){ + req.session.username = req.body.username; + res.redirect("/secured"); + //res.render('stackoverflow/index', { title: 'Cosson games' }); + } + } +}); /* io.of('/belote').on('connection', function (socket) { socket.emit('news', { hello: 'world' }); @@ -59,12 +70,13 @@ io.of('/belote').on('connection', function (socket) { console.log(data); }); }); - +*/ +/* io.configure(function (){ io.set('authorization', function (handshakeData, callback) { var cookies = parseCookie(handshakeData.headers.cookie); - //console.log(cookies); - var sessionID = null;//cookies['connect.sid']; + console.log(cookies); + var sessionID = cookies['connect.sid']; if (!sessionID) { callback('No session', false); } else { @@ -80,8 +92,33 @@ io.configure(function (){ } }); }); +*/ +io.set('authorization', function (data, accept) { + if (data.headers.cookie) { + data.cookie = parseCookie(data.headers.cookie); + console.log(data.cookie); + data.sessionID = data.cookie['express.sid']; + if(!data.sessionID) return accept('Not logged in.', false); + app.sessionStore.get(data.sessionID, function (err, session) { + if (!err && session && session.username) { + data.username = session.username; + callback(null, true); + } else { + return accept('Not logged in.', false); + } + }); + } else { + return accept('No cookie transmitted.', false); + } + accept(null, true); +}); +io.sockets.on('connection', function (socket) { + console.log('A socket with sessionID ' + socket.handshake.sessionID + + ' connected!'); +}); +/* io.on('connection', function (socket) { var sessionID = socket.handshake.sessionID; var username = socket.handshake.username;