2013-03-25 15 views
18

के साथ मेरे ऐप में "मुझे याद रखें" जोड़ने के लिए this जैसे लॉग इन करते समय मुझे "मुझे याद रखें" चेकबॉक्स की आवश्यकता है। और मैं पासपोर्टपासपोर्ट

app.use(function (req, res, next) { 
if (req.method == 'POST' && req.url == '/login') { 
    if (req.body.rememberme) { 
    req.session.cookie.maxAge = 1000 * 60 * 3; 
    } else { 
    req.session.cookie.expires = false; 
    } 
} 
next(); 
}); 
app.use(passport.initialize()); 
app.use(passport.session()); 

का उपयोग कर रहा प्रवेश नहीं कर सकते जब req.body.rememberme सच है और जब req.body.rememberme गलत है उपयोगकर्ता याद किया जाता है से पहले एक मिडलवेयर जोड़ें। मैंने कनेक्ट-सुनिश्चित-लॉगिन का भी प्रयास किया और यह अभी भी गलत है।

और दूसरा प्रश्न: मुझे अपने डेटाबेस में कुकीज़ कब हटाएं और कैसे?

:)

अन्य कोड वास्तव में पासपोर्ट गाइड के रूप में एक ही है

मार्ग:

app.get('/', passport.authenticate('local', {failureRedirect: '/login'}), function (req, res) { res.redirect('/user/home'); }); 
app.post('/login', passport.authenticate('local', {failureRedirect: '/login'}), function (req, res) { res.redirect('/user/home'); }); 

सत्र:

passport.serializeUser(function(user, done) { 
var CreateAccessToken = function() { 
    var token = user.GenerateSalt(); 
    User.findOne({accessToken: token}, function(err, existingUser) { 
    if (err) return done(err); 
    if (existingUser) { 
     CreateAccessToken(); 
    } else { 
     user.set('accessToken', token); 
     user.save(function(err) { 
     if (err) return done(err); 
     return done(null, user.get('accessToken')); 
     }) 
    } 
    }); 
}; 
if (user._id) 
    CreateAccessToken(); 
}); 
passport.deserializeUser(function(token, done) { 
    User.findOne({accessToken: token}, function(err, user) { 
    if (err) return done(err); 
    return done(err, user); 
    }); 
}); 

और रणनीति:

passport.use(new LocalStrategy(function(userId, password, done) { 
User.findOne().or([{username: userId}, {email: userId}]).exec(function(err, user) { 
    if (err) return done(err); 
    if (!user) { 
    return done(null, false, {message: 'Invalid password or username'}); 
    } 
    if (user.Authenticate(password)) { 
    return done(null, user); 
    } else { 
    return done(null, false, {message: 'Invalid password or username'}); 
    } 
}); 
})); 

मैंने देखा कि एक्सप्रेस केवल कुकी को अपडेट करेगा जब हैश मान बदल जाएगा। तो मैं मिडलवेयर

app.use(function (req, res, next) { 
    if (req.method == 'POST' && req.url == '/login') { 
     if (req.body.rememberme) { 
     req.session.cookie.maxAge = 1000 * 60 * 3; 
     req.session._garbage = Date(); 
     req.session.touch(); 
     } else { 
     req.session.cookie.expires = false; 
     } 
    } 
    next(); 
}); 

में संशोधित किया है अब मैं "मुझे याद रखें" के साथ प्रवेश कर सकते हैं, लेकिन यह केवल Ubuntu पर क्रोमियम और फ़ायरफ़ॉक्स पर काम करता है। मैं अभी भी Win7 और एंड्रॉइड पर क्रोम और फ़ायरफ़ॉक्स पर "मुझे याद रखें" चेकबॉक्स से लॉगिन नहीं कर सकता।

मैंने Win7 पर क्रोम पर "/ login" पर पोस्ट करते समय प्रतिक्रिया शीर्षलेख की जांच की और यह उसी "सेट-कुकी" फ़ील्ड के रूप में उबंटू पर था, यह क्यों काम नहीं कर सकता?


समय सिंक से बाहर है ... इसलिए मैं एक अतिरिक्त समय क्षेत्र पोस्ट करता हूं।

$('#login').ajaxForm({beforeSubmit: function(arr, $form, option) { 
    arr.push({name: '__time', value: (new Date()).toGMTString()}); 
}}); 

और "RememberMe" मिडलवेयर:

app.use(function (req, res, next) { 
    if (req.method == 'POST' && req.url == '/login') { 
     if (req.body.rememberme) { 
     req.session.cookie.maxAge = moment(req.body.__time).add('m', 3) - moment(); 
     req.session._garbage = Date(); 
     req.session.touch(); 
     } else { 
     req.session.cookie.expires = false; 
     } 
    } 
    next(); 
}); 
+0

यह गंभीर रूप से गलत नहीं है? यदि 'rememberme == true' का अर्थ है कि कुकी का समय समाप्त नहीं होना चाहिए?आपको अधिक कोड पोस्ट करना चाहिए क्योंकि आपको इन तीन मिडलवायर – pfried

+0

से अधिक की आवश्यकता है यदि 'यादृच्छिक == सत्य' कुकी को समाप्त हो जाती है (इस मामले में 3 मिनट का), अन्यथा कुकी को सत्र कुकी बनने के लिए बनाया जाता है (ब्राउज़र की समयसीमा समाप्त हो जाती है) सत्र किया जाता है)। लेकिन मैं सहमत हूं: अधिक कोड की आवश्यकता है। – robertklep

+0

यह कोड बहुत भ्रमित है। आपको चिंताओं को अलग करना चाहिए। 'Serialize' और' deserialize' फ़ंक्शंस उपयोगकर्ता को अपनी आईडी (डेटाबेस आईडी का उपयोग करके) प्राप्त करने के लिए और सत्र कुकी में क्रमबद्ध करने के लिए ऑनी हैं (यदि आप चिंता करते हैं तो आईडी स्पष्ट टेक्स्ट में नहीं होगी)। कुछ संदिग्ध सुरक्षा कोड में मिश्रण न करें – pfried

उत्तर

1

सुनिश्चित करें कि app.use(express.bodyParser()) अपने मिडलवेयर ऊपर रखा गया है, जैसा कि आप req.body.rememberme

25

मैं आप के रूप में बिल्कुल एक ही समस्या थी पर भरोसा कर रहे हैं। निम्नलिखित कोड मेरे लिए काम करता है:

app.post("/login", passport.authenticate('local', 
    { failureRedirect: '/login', 
     failureFlash: true }), function(req, res) { 
     if (req.body.remember) { 
      req.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000; // Cookie expires after 30 days 
     } else { 
      req.session.cookie.expires = false; // Cookie expires at end of session 
     } 
     res.redirect('/'); 
}); 
+0

यह वही है जो मुझे चाहिए, धन्यवाद। –

+0

मैंने उदाहरण के समय को 3 मिनट से संपादित किया है (जो अधिकांश सत्रों से कम है) 30 दिनों तक। मैं सोच रहा था कि 3 मिनट मुझे याद रखने वाला मोड था, और '... समाप्त हो गया = झूठा;' मतलब कभी समाप्त नहीं हुआ। – rjmunro

5

अब जेरेड हैंनसन द्वारा लिखित याद रखें कार्यक्षमता जोड़ने के लिए पासपोर्ट रणनीति है।

https://github.com/jaredhanson/passport-remember-me

यह जारी करके काम करता है एक अनूठा याद-मुझे हर सत्र के शुरू में सेवन किया जाता है के दौरान टोकन अगले (भविष्य में उपयोग के लिए यह अमान्य।) नतीजतन, यह एक अधिक होने की संभावना है सुरक्षित समाधान

+0

यदि आपका ऐप koa.js ऐप है, तो https://github.com/clthck/passport-remember-me मेरे लिए ठीक काम करता है। यह वास्तव में जेरेडहंसन के मूल रेपो का एक कांटा है और यह सिर्फ कोआ.जेएस ऐप ([कोआ-पासपोर्ट] के साथ एक समर्थन जोड़ता है (https://github.com/rkusa/koa-passport)) – artificis

+0

यह भी ध्यान देने योग्य है कि यह भी ध्यान देने योग्य है सच के लिए 'मुझे याद रखें' - आपको टोकन के लिए किसी प्रकार की लंबी अवधि की दृढ़ता की आवश्यकता होगी, या तो कैश या डेटाबेस में - अन्यथा सर्वर उन्हें स्मृति में संग्रहीत करेगा। आप सर्वर को पुनरारंभ करने में सक्षम होना चाहते हैं और अभी भी मुझे याद रखना है कि टोकन मान्य होना चाहिए – tcmoore

संबंधित मुद्दे