如何添加“记住我”与我的护照应用程序

login时需要“记住我”checkbox。 我使用护照之前添加一个中间件

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为真时,我无法login,并且在req.body.rememberme为false时记住用户。 我也试过连接,确保login,它仍然是错误的。

另一个问题是:我应该在什么时候删除我的数据库中的cookies,以及如何?

🙂

其他代码与护照指南完全相同

路线:

 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'}); } }); })); 

我注意到Express只会在散列值发生变化时更新cookie。 所以我修改了中间件的代码

 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(); }); 

现在我可以用“Remember Me”login,但是它只能在Ubuntu上运行在chromium和firefox上。 我仍然无法login在Win7和Android上的Chrome和Firefox上的“记住我”checkbox。

我检查响应标题时POST到“/login”在WIN7铬上,它有相同的“Set-Cookie”字段,因为它在Ubuntu上,为什么它不能工作?


时间不同步…所以我张贴额外的时间字段。

 $('#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(); }); 

       

网上收集的解决方案 "如何添加“记住我”与我的护照应用程序"

我和你有完全一样的问题。 以下代码适用于我:

 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('/'); }); 

现在有一个Passport的策略来添加由Jared Hanson写的Remember Mefunction。

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

这是通过在下一个开始消耗的每个会话期间发出一个唯一的记忆-Me标记来工作的(使其失效以供将来使用)。因此,这可能是更安全的解决scheme。

确保app.use(express.bodyParser())位于中间件之上,因为您依赖于req.body.rememberme