heroku Express-在隐身模式下,会话无法在生产环境中运行

p4tfgftt  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(117)

我使用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,因此产生错误。

yvt65v4c

yvt65v4c1#

在我的理解中,express会话就像是存储在express示例运行上下文中的Map。每个请求都将根据该Map中是否存在一个条目进行验证。在本地,您运行的是express服务器的单个示例...
在heroku示例中可能不是这样。应该有多个Express服务器示例在代理后运行。
因此..您的会话创建请求发送到instance_1,它使用一个cookie进行响应,以引用其内部会话Map的条目。
代理将进一步的请求转发到一个不同的express示例,比如instance_2,它对instance_1中创建的会话一无所知。
因此,它返回401,并使会话不一致。
有几种方法可以将db存储在一个常见的DBs.like外部mongo中。
请谷歌和尝试..

相关问题