我使用express-session来处理用户会话。问题是当我在生产中处于隐身模式时,它不起作用。我使用heroku来部署我的node js应用程序。
在localhost上,我使用这个,它在正常模式和隐姓埋名模式下都能工作。
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
store: store,
cookie: {
maxAge: 1000 * 60 * 60 * 100,
},
})
);
但是一旦部署完成,我就使用下面的代码,因为上面的代码在生产模式下不起作用,也不设置cookie。
app.use( session({
store: store,
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: true,
proxy: true,
cookie: {
secure: true,
maxAge: 1000 * 60 * 60 * 48,
sameSite: "none",
}, }) );
我发现了一个类似的问题但没有答案:Express Session is not working in production on incognito mode but everything working fine locally
编辑
经过几个小时的搜索。我认为这个问题与heroku如何处理cookie有关,如果从一个不同的域发送,例如:www.my-front-end.netlify.app请求来自www.my-heroku-backend.app的api如果有人在incognito上允许第三方cookie,那么问题就解决了。我可能是错的,请随时纠正我。谢谢大家。有关更多信息,请查看:https://devcenter.heroku.com/articles/cookies-and-herokuapp-com
TLDR:Heroku发送第三方cookie。Incognito阻止第三方cookie,因此产生错误。
1条答案
按热度按时间yvt65v4c1#
在我的理解中,express会话就像是存储在express示例运行上下文中的Map。每个请求都将根据该Map中是否存在一个条目进行验证。在本地,您运行的是express服务器的单个示例...
在heroku示例中可能不是这样。应该有多个Express服务器示例在代理后运行。
因此..您的会话创建请求发送到instance_1,它使用一个cookie进行响应,以引用其内部会话Map的条目。
代理将进一步的请求转发到一个不同的express示例,比如instance_2,它对instance_1中创建的会话一无所知。
因此,它返回401,并使会话不一致。
有几种方法可以将db存储在一个常见的DBs.like外部mongo中。
请谷歌和尝试..