如何添加“记住我”与我的护照应用程序
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