cookie 生命周期过期后,Passport js 无法正常工作
Passport js is not working after cookie lifetime expired
最近我在我的 express js 项目中发现了 tricki 错误,如果能帮助我调试它,我将不胜感激。
这与 question 相关,但答案并未解决问题,因为我想指定 maxAge
并且从会话配置中删除此参数对我来说不是解决方案。
我正在使用 Passport js + express-session
这是我的会话配置:
var passport = require('passport');
var session = require('express-session');
var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.use(session({
secret: 'MySecret',
resave: false,
saveUninitialized: false,
cookie : {
secure: false, // If it's true, login is not working as well
maxAge: new Date(Date.now() + (60 * 1000 * 30))
}
}));
app.use(passport.initialize());
app.use(passport.session());
为了检查用户是否已通过身份验证,我使用了简单的中间件:
middlewareObj.isLoggedIn = function(req, res, next) {
if (req.isAuthenticated()){
return next();
} else {
return res.redirect('/signin');
}
};
护照本地登录:
passport.use('local-signin', new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function (req, email, password, done) {
var User = user;
var isValidPassword = function (userpass, password) {
return bCrypt.compareSync(password, userpass);
}
User.findOne({
where: {
email: email
}
}).then(function (user) {
if (!user) {
return done(null, false, req.flash('error', 'User does not exists'));
}
if (!isValidPassword(user.dataValues.userPassword, password)) {
return done(null, false, req.flash('error', 'Incorrect password.'));
}
return done(null, {user});
}).catch(function (error) {
return done(null, false, req.flash('error',error.message));
});
}
));
这是我的注销路线:
router.get('/logout',(req,res) => {
req.session.destroy(function(err) {
return res.redirect('/');
});
});
标准用户登录工作正常,提交登录表单后,用户 serialized
比 deserialized
和 isAuthenticated()
方法 returns true
.
但是 cookie 配置(maxAge
恰好)出现了一些问题。当 cookie 生命周期到期时,下一个用户的登录将不再有效。 isAuthenticated()
方法返回 false
(req
中不存在用户对象)。
重启服务器后,用户可以正常登录,但是当cookiemaxAge
到达后,下次登录又不能了。护照没有显示任何错误。
这可能与您的 maxAge
价值观有关。 expressjs/sessions package docs 指出 maxAge
是 "the number (in milliseconds) to use when calculating the Expires Set-Cookie attribute".
您正在将 Date
传递给 maxAge
;它期望 cookie 过期之前的毫秒数。
最近我在我的 express js 项目中发现了 tricki 错误,如果能帮助我调试它,我将不胜感激。
这与 question 相关,但答案并未解决问题,因为我想指定 maxAge
并且从会话配置中删除此参数对我来说不是解决方案。
我正在使用 Passport js + express-session
这是我的会话配置:
var passport = require('passport');
var session = require('express-session');
var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.use(session({
secret: 'MySecret',
resave: false,
saveUninitialized: false,
cookie : {
secure: false, // If it's true, login is not working as well
maxAge: new Date(Date.now() + (60 * 1000 * 30))
}
}));
app.use(passport.initialize());
app.use(passport.session());
为了检查用户是否已通过身份验证,我使用了简单的中间件:
middlewareObj.isLoggedIn = function(req, res, next) {
if (req.isAuthenticated()){
return next();
} else {
return res.redirect('/signin');
}
};
护照本地登录:
passport.use('local-signin', new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function (req, email, password, done) {
var User = user;
var isValidPassword = function (userpass, password) {
return bCrypt.compareSync(password, userpass);
}
User.findOne({
where: {
email: email
}
}).then(function (user) {
if (!user) {
return done(null, false, req.flash('error', 'User does not exists'));
}
if (!isValidPassword(user.dataValues.userPassword, password)) {
return done(null, false, req.flash('error', 'Incorrect password.'));
}
return done(null, {user});
}).catch(function (error) {
return done(null, false, req.flash('error',error.message));
});
}
));
这是我的注销路线:
router.get('/logout',(req,res) => {
req.session.destroy(function(err) {
return res.redirect('/');
});
});
标准用户登录工作正常,提交登录表单后,用户 serialized
比 deserialized
和 isAuthenticated()
方法 returns true
.
但是 cookie 配置(maxAge
恰好)出现了一些问题。当 cookie 生命周期到期时,下一个用户的登录将不再有效。 isAuthenticated()
方法返回 false
(req
中不存在用户对象)。
重启服务器后,用户可以正常登录,但是当cookiemaxAge
到达后,下次登录又不能了。护照没有显示任何错误。
这可能与您的 maxAge
价值观有关。 expressjs/sessions package docs 指出 maxAge
是 "the number (in milliseconds) to use when calculating the Expires Set-Cookie attribute".
您正在将 Date
传递给 maxAge
;它期望 cookie 过期之前的毫秒数。