【发布时间】:2022-01-09 19:17:29
【问题描述】:
根据Log user out of previous sessions,我使用 NodeJS 和 express-session 将会话信息存储在数据库中。相关代码在主脚本文件中:
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);
// Initialize mongodb session storage to remember users.
const store = new MongoDBStore({
uri: config.mongoUri,
// The 'expires' option specifies how long after the last time this session was used should the session be deleted.
// Effectively this logs out inactive users without really notifying the user. The next time they attempt to
// perform an authenticated action they will get an error. This is currently set to 3 months (in milliseconds).
expires: max_session_ms,
});
// Enable sessions using encrypted cookies
app.use(cookieParser(config.secret));
app.use(
session({
cookie: {
// Specifies how long the user's browser should keep their cookie, probably should match session expiration.
maxAge: max_session_ms
},
store: store,
secret: config.secret,
signed: true,
resave: true,
saveUninitialized: true,
httpOnly: true, // Don't let browser javascript access cookies.
secure: config.secureCookies, // Only use cookies over https in production.
})
);
在路由文件中:
passport.use('user-otp', new CustomStrategy(
// code to validate one-time password.
));
问题在于,这种方法还会在浏览器上为未登录的用户存储 cookie。以下是访问公共页面的示例:
我只想在创建帐户或登录后(用户同意 cookie 政策)存储 cookie,而不是在公共页面上存储 cookie,以避免 GDPR 要求的“cookie 同意框”。
如何仅在浏览器登录后存储 cookie?
更新
我按照答案中的建议删除了两个cookie。我停止服务器,消除localhost 的cookies,启动服务器,发出公共页面请求,公共页面上还有一个cookie。这是服务器数据库上的会话数据:
> db.sessions.find().pretty()
{
"_id" : "DObp-FFNJGLD5c5kLKWfkCaEhfWHtWpo",
"expires" : ISODate("2022-03-03T19:41:29.807Z"),
"session" : {
"cookie" : {
"originalMaxAge" : 7776000000,
"expires" : ISODate("2022-03-03T19:41:29.807Z"),
"secure" : null,
"httpOnly" : true,
"domain" : null,
"path" : "/",
"sameSite" : null
},
"flash" : {
}
}
}
浏览器会显示这个 cookie:
当我从应用程序中删除 PassportJS 以及将 sameSite 设置为 "strict" 时,我得到了相同的结果。
第二次更新
由于数据库会话有一个空的flash 字段,我怀疑这是由于闪现消息。我删除了这段代码:
const flash = require("express-flash");
app.use(flash());
现在服务器不存储用于访问公共页面的 cookie。我在通知中为登录用户和公共页面访问者使用 Flash 消息,例如当页面不再可用时。
所以问题变成了:是否可以仅在服务器端使用闪存消息,从一个处理程序到另一个处理程序,而不存储 cookie?
【问题讨论】:
标签: node.js express session cookies express-session