2013-02-26 113 views
6

लक्ष्यसत्र passport.js

मैं आपकी क्या अपेक्षाएं हैं:

  • उपयोगकर्ता के सत्र बनाएं सॉकेट के लिए एक सत्र बनाएँ (socket.io)
  • लॉगिन और socket सत्रों को प्रमाणीकृत करने के लिए passport.js का उपयोग करें।

नोट्स

मैं MongoStore और passport.socket.io npm's स्थापित किया है। मैं प्रवेश और उपयोगकर्ता के cookie में (connect.sid)


लॉग इन सेट कर सकते हैं प्रश्न

मैं कैसे करूँ सेटअप प्रणाली 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

आप एक चर में अपना नया स्मृति कहानी वस्तु दृष्टान्त की दुकान है और दोनों के लिए इसे पारित व्यक्त करने और इसलिए तरह सॉकेट कब। (ध्यान रखें कि हम विभिन्न दुकानों का उपयोग कर रहे हो लेकिन सिद्धांत रूप में यह कोई बात नहीं करना चाहिए कि तुम क्या जब तक आप उचित तरीके से नियंत्रण पास के रूप में उपयोग की दुकान) ...

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

+0

जब आप एक और बात कहते हैं तो आप कह रहे हैं कि आपको जवाब देने की आवश्यकता है कि आपका सत्र क्यों हटाया जाता है और लॉगिन पर वापस जाता है ??? –

+1

मुझे लगता है कि यह उचित व्यवहार है। एक बार सर्वर को पुनरारंभ करने के बाद इसे सभी नए सत्र शुरू करना चाहिए। ऐसा इसलिए है क्योंकि आपको पुनरारंभ करने के बाद पुन: प्रमाणीकरण करना होगा और प्रमाणीकरण के बाद एक नया सत्र आईडी उत्पन्न होनी चाहिए। क्या आप कह रहे हैं कि सर्वर को पुनरारंभ करने के बाद भी आप सत्रों को जारी रखना चाहते हैं? –