2013-02-26 88 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