Паспорт js не работает после истечения срока действия куки - PullRequest
0 голосов
/ 04 мая 2018

Недавно я обнаружил ошибку 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 следующий вход в систему снова не работает. В паспорте нет ошибок.

1 Ответ

0 голосов
/ 05 мая 2018

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

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

...