Недавно я обнаружил ошибку tricki в моем проекте Express JS, и я был бы признателен за помощь в его отладке.
Это связанный вопрос , но ответ не решает проблему, потому что я хочу указать 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()
возвращает true
.
Но конфигурация cookie (точно maxAge
) создает некоторые проблемы. Когда срок действия cookie истек, логин следующего пользователя больше не работает. isAuthenticated()
метод возвращает false
(пользовательский объект не существует внутри req
).
После перезапуска сервера пользователь может войти в систему в обычном режиме, но при достижении файла cookie maxAge
следующий вход в систему снова не работает. В паспорте нет ошибок.