2013-02-26 87 views
6

目标会话与express.js + passport.js

我想要做什么:

  • 用户
  • 创建一个会话创建套接字会话(socket.io
  • 使用passport.js来验证登录和socket会话。

注意

我已经安装了MongoStorepassport.socket.io npm's。我可以登录并设置用户的登录(connect.sid


cookie问题

如何设置系统存储socket会议,他们夫妇与用户的session


代码

app.js

/* The usual express setup */ 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    User = require('./models/user.js'), 
    MongoStore = require('connect-mongo')(express); 

app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.session({ 
    secret: 'chuck norris', 
    store: new MongoStore({db: User.name}, // the db's name 
     function(err) { 
      console.log(err || 'connect ok!'); 
     }) 
    })); 
    app.use(express.methodOverride()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 

app.js(护照部分)

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password' 
    }, 
    function(username, password, done) { 
    User.findOne({username: username}, function(err, user) { 
     if(!user) { 
     return done(null, false, {message: 'Incorrect Username!'}); 
     } 
     if(!user.validPassword(password)) { 
     return done(null, false, {message: 'Incorrect Password!'}); 
     } 
     return done(null, user); 
    }); 
    } 
)); 


passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

app.post('/', 
    passport.authenticate('local'), 
    function(req, res) { 
     res.redirect('/home/'+req.user.username); 
    }); 

app.js(socket.io部分)

io.set('authorization', passportSocket.authorize({ 
    key: 'connect.sid', 
    secret: 'chuck norris', 
    store: /* Not entirely sure what goes here */ 
    fail : function(data, accept) { accept(null, false); }, 
    success: function(data, accept) { accept(null, true); } 
})); 


io.sockets.on('connection', function(socket) { 
    console.log('User Connected: ' + socket.handshake.user.username); 
}); 

回答

10

您在新的记忆故事的对象实例存储到一个变量,并将它传递到这两个表达和插座IO像这样。 (注意,我们使用不同的商店,但在理论上它不应该不管什么保存您只要你通关控制的正确方法使用)...

var ... 
,MemoryStore = express.session.MemoryStore 
,sessionStore = new MemoryStore(); 

然后app.configure你.. 。

app.use(express.session({store:sessionStore,secret:'secret',key:'express.sid'})); 

终于在socket.io配置

io.configure(function(){ 
io.set("authorization", passportSocketIo.authorize({ 
    key: 'express.sid',  //the cookie where express (or connect) stores its session id. 
    secret: 'secret', //the session secret to parse the cookie 
    store: sessionStore,  //the session store that express uses 
    fail: function(data, accept) { 
     // console.log("failed"); 
     // console.log(data);// *optional* callbacks on success or fail 
     accept(null, false);    // second param takes boolean on whether or not to allow handshake 
    }, 
    success: function(data, accept) { 
     // console.log("success socket.io auth"); 
    // console.log(data); 
     accept(null, true); 
    } 
})); 

如果你已经正确地做到了这一点,你的用户成功验证,那么你应该能够访问ŧ他在握手对象上的会话数据。

console.log(socket.handshake.user.username); 
//or sometimes it might be... 
console.log(socket.handshake.user[0].username); 

希望有帮助。

+1

非常感谢。还有一件事,当服务器重新启动时,用户会话被删除,页面返回到登录屏幕。 – ashley 2013-02-28 10:46:13

+0

当你说你还有一件事你需要我回答为什么你的会话被删除并返回登录? – 2013-02-28 11:28:05

+1

我认为这是正确的行为。一旦你重新启动服务器,它应该开始所有新的会话。这是因为必须在重新启动后重新进行身份验证,并在身份验证后生成新的会话ID。你是否想要在服务器重新启动后还想继续进行会话? – 2013-02-28 11:31:47