Express-Session 在生产/部署中不起作用

Posted

技术标签:

【中文标题】Express-Session 在生产/部署中不起作用【英文标题】:Express-Session not working in production/deployment 【发布时间】:2021-04-22 07:23:50 【问题描述】:

Express-Session 在开发环境中运行,因为它在我的浏览器中设置了“connect.sid”cookie。但是,在生产中,它不存储 cookie,而是使用相同的会话 - 它每次都会创建一个新会话。我相信如果我能以某种方式保存第三方 cookie,这个问题就会得到解决,因为我的应用程序是使用 Heroku 部署的。最后,我还使用了 express-cors 来避免 CORS 问题(不知道这是否与 cookie 问题有关)。我在 cors 中设置了 credentials: true,在 Axios 中也设置了 withCredentials: true。

【问题讨论】:

这里没有足够的架构信息让我们能够提供帮助。显示您的快速会话初始化代码。准确描述首次创建会话时使用的请求 URL,然后您看到创建新会话的后续 URL。然后,显示创建第一个会话的确切客户端代码和无权访问同一会话的第二个客户端代码。准确地显示所有 URL,就像它们在现实世界中一样。 由于您可能是这里的新手,所以关于代码的问题应该始终显示相关代码。当您展示相关的实际代码时,您将获得更准确和更快的答案。这使我们能够看到您的具体问题并提供具体的解决方案,而不必试图教一本书中的一整章来猜测您的情况可能会发生什么,并用所有可能的方式解释一个完整的通用解决方案。第一个小时完全没有参与是因为您的问题太模糊,并且没有包含您的代码或足够详细地描述情况。 【参考方案1】:

Heroku 使用反向代理。它提供 https 端点,然后将未加密的流量转发到网站。

试试类似的东西

app.enable('trust proxy')

然后退房 https://expressjs.com/en/guide/behind-proxies.html

【讨论】:

谢谢!我刚刚解决了这个问题。 没有用,但你对 heroku 代理是正确的。当我使用 express-session 时,我只需将以下行添加到 cookie.sameSite。 sameSite:cookie: httpOnly: true, secure: true, maxAge: 1000 * 60 * 60 * 48, sameSite: 'none' 【参考方案2】:

问题已解决! -> 添加相同站点:'无' 用于生产的完整 Cookie 配置(快速会话):

饼干: httpOnly:是的, 安全:真实, 最大年龄:1000 * 60 * 60 * 48, 同一站点:“无”

【讨论】:

【参考方案3】:

向会话配置添加“名称”属性对我有用:


    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: true,
    proxy: true, // Required for Heroku & Digital Ocean (regarding X-Forwarded-For)
    name: 'MyCoolWebAppCookieName', // This needs to be unique per-host.
    cookie: 
      secure: true, // required for cookies to work on HTTPS
      httpOnly: false,
      sameSite: 'none'
    
  

【讨论】:

以上是关于Express-Session 在生产/部署中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Express-session 和 express-socket.io-session 在 angular2 / typescript 环境中不起作用

react-router 在生产和浪涌部署中不起作用

iOS 推送通知在生产环境 (GPGS) 中不起作用

gzip 在带有 Whitenoise 的 Django 中不起作用

亚马逊应用内购买在生产环境中不起作用

Tailwind 自定义颜色在 Angular 生产构建中不起作用