Я установил время ожидания сеанса на 30 минут. Пока я еще активен, req.session.user
удаляется через 30 минут. Тем не менее, сессия все еще жива. Вот мой конфиг (использую экспресс-сессию и паспорт.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,\"срок действия\":\"2018-11-15T06:04:26.994Z\",\"httpOnly\":true,\" path\":\"/\"},\"user\":{\"email\":\"[email protected]\",\"sessionId\":\"некоторый идентификатор сеанса\"}}"
Затем, через 30 минут, я посмотрел на Redis, ключ сеанса все еще там, но он перестал увеличивать срок действия. В то время как req.session по-прежнему увеличивает срок действия, но с удалением свойства пользователя.