我使用express-session来存储与用户会话相关的数据,例如登录状态和access_tokens。 我还使用 connect-session-sequelize 为会话创建存储,因此与 cookie 相关的信息将保存到连接的表中。 但是,我的问题是,即使我没有向会话表添加额外的列来说明我存储的额外数据(例如登录状态和令牌),它们仍然能够通过重新启动 Express 服务器来保留。
app.use( session( {
secret: SESSION_KEY,
resave: false,
saveUninitialized: false,
store: new sequelizeStore( {
db: db.sequelize,
table: 'sessions'
} ),
cookie: {
secure: true,
maxAge: 600000
}
} ) );
请注意,在上面的代码中,我保留默认表而不扩展它,因此它只有 sid、expires 和 data 列,这些列在为用户生成会话时保存。
app.get( '/auth', async ( req, res ) => {
if ( !req.session.loggedIn ) {
//Login here and obtain Oauth2 tokens
req.session.loggedIn = true;
req.session.access_token = access_token;
req.session.save();
res.redirect( `https://localhost/servers` );
} else {
res.redirect( `https://localhost/servers` );
}
} );
在上面的代码中,当访问身份验证端点时,它会检查会话是否已登录,如果没有,它会尝试登录并为会话进行设置,否则它将重定向到服务器页面。 LoggedIn 会话变量未保存到表中,但是当我点击该端点以登录会话然后重新启动 Express 服务器时,尽管没有保存到表中,会话变量 LoggedIn 仍然存在。 怎么会这样呢? 会话是否存储在其他地方?
您不需要向会话表添加列,因为会话数据在存储到数据库时会序列化为 JSON(在大多数情况下),包括添加到其中的任何自定义字段。
当服务器从存储中提取会话时,它会被反序列化,您可以访问这些自定义字段。
请注意,如果您使用 connect-session-sequelize,您可以选择配置 extendDefaultFields,这会影响您通过这些特定字段查询会话数据的能力,但为了将自定义字段存储为一部分,这不是必需的会话数据对象的。