【发布时间】:2018-11-08 09:34:04
【问题描述】:
我将会话超时设置为 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>.... }
然后我读到了一些关于 express-session 调用的touch 方法。文档说如果store实现了这个touch方法,那么设置resave: false就可以了。所以,考虑到redis可能没有实现这个方法,我尝试设置resave: true。然后,当我记录会话时,我注意到过期时间现在正在增加,而之前的过期时间仅在用户被删除后才会增加。但是,30 分钟后,用户密钥再次被删除。
然后根据 niry 的建议,我设置了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\":\"some session id\" }}"
然后在 30 分钟后,我查看了 redis,会话密钥仍然存在,但它停止增加到期时间。同时,req.session 仍然会增加到期时间,但会删除用户属性。
【问题讨论】:
-
请发布 redis 选项。我怀疑你设置了数据的过期时间。
-
我没有在 Redis 上设置任何过期时间。在选项中,我只提供要连接的客户端。此外,即使我遇到超时,会话 id 仍然保留在 redis 中。
-
只是为了澄清,“遇到超时”,我的意思是我设置的 req.session.user 在 30 分钟仍然处于活动状态后被删除。我在想护照有问题,也许,我不确定。
标签: node.js passport.js node-redis