Недавно я обнаружил ошибку tricki в своем проекте express js и был бы благодарен за помощь с ее отладкой.

Это связанный с вопрос , но ответ не решает проблему, потому что я хочу указать maxAge, и удаление этого параметра из конфигурации сеанса не является решением для меня.

Я использую Passport js + экспресс-сессию

Это моя конфигурация сеанса:

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 следующий вход снова не работает. Паспорт не показывает ошибок.

0
Marcin 4 Май 2018 в 23:31

1 ответ

Лучший ответ

Скорее всего, это как-то связано с вашим значением maxAge. В документах пакета expressjs / sessions указано, что maxAge - это "число (в миллисекундах) для использования при вычислении атрибута Expires Set-Cookie ".

Вы передаете Date на maxAge; он ожидает количество миллисекунд до истечения срока действия cookie.

1
Kryten 4 Май 2018 в 21:02