Я установил тайм-аут сессии на 30 минут. Пока я все еще активен, req.session.user
удаляется через 30 минут. Однако сессия все еще жива. Вот мой конфиг (я использую express-session и passport.js):
app.use(session({
store: new RedisStore({client: <my client>, disableTTL: true}),
secret: <some_secret>,
resave: true,
saveUninitialized: false,
cookie: {maxAge: 1800000}
}));
app.use(passport.initialize());
app.use(passport.session());
// Are these serializer/deserializer needed?
passport.serializeUser((user, done) => {
done(null, user);
});
passport.deserializeUser((user, done) => {
done(null, user);
});
В логине:
router.post('/login', (req, res, next) => {
passport.authenticate('ldapauth', {session: false}, (err, user, info) => {
...
if (user) {
req.session.user = {email: req.body.username};
}
next();
})(req, res);
});
Код подтверждения выглядит следующим образом:
isLoggedIn() {
if (req.session && req.session.user) {
return true;
}
return false;
}
Я установил req.session.user
для некоторого объекта после успешного входа в систему.
Итак, через 30 минут req.session.user
удаляется, но req.session
все еще там и продолжает увеличивать дату истечения, поскольку я все еще активно работаю над страницей.
Почему req.session.user
удаляется через 30 минут? Я думал, что паспорт едет на сессии экспресс?
* ОБНОВЛЕНИЕ *
Сначала я думал, что срок действия увеличивается, но это не так. Ранее я установил resave: false
. Затем, когда я регистрирую сеанс, срок действия всегда один и тот же:
Session {
cookie:
{ path: '/', _expires: <some date>.... }
user:
{ email: <the one i set before>, sessionId: <some id> } }
Затем через 30 минут пользователь удаляется. Только в этот момент срок действия начинает увеличиваться.
Session {
cookie:
{ path: '/', _expires: <some date>.... }
Затем я прочитал кое-что о touch
методе, который вызывает экспресс-сеанс. В документации сказано, что если хранилище реализует этот метод touch
, тогда можно установить resave: false
. Итак, думая, что redis может не реализовывать этот метод, я попытался установить resave: true
. Затем, когда я регистрирую сеанс, я заметил, что срок действия увеличивается, по сравнению с предыдущим, что он увеличивается только после удаления пользователя. Однако через 30 минут снова пользовательский ключ удаляется.
Затем с предложением нири я установил disableTTL: true
. Снова произошло то же самое.
В redis я пытаюсь получить ключ. До истечения 30 минут, срок действия в Redis увеличивается:
127.0.0.1:6379> mget sess:<some id>
1) "{\" cookie \ ": {\" originalMaxAge \ ": 1800000, \" expires \ ": \" 2018-11-15T06: 04: 26.994Z \ ", \" httpOnly \ ": true , \ "path \": \ "/ \"}, \ "user \": {\ "email \": \ "test@email.com \", \ "sessionId \": \ "некоторый идентификатор сеанса \" }} "
Затем через 30 минут я посмотрел на redis, сеансовый ключ все еще там, но он прекратил увеличивать срок действия. Хотя req.session все еще увеличивает срок действия, но свойство пользователя удаляется.