【问题标题】:Cookie not set with express-session in productionCookie 未在生产中使用 express-session 设置
【发布时间】:2019-05-18 01:28:09
【问题描述】:

我的应用分为客户端和服务器。客户端是托管在 Now.sh 上的前端 Nextjs 应用程序,服务器是使用 Express 创建并托管在 Heroku 上的后端,因此域是 client-app.now.sh 和 server-app.herokuapp.com。


身份验证

身份验证系统基于 cookie,我使用 express-session 来实现它。这是我的快速会话配置

app.use(
  session({
    store:
      process.env.NODE_ENV === "production"
        ? new RedisStore({
            url: process.env.REDIS_URL
          })
        : new RedisStore({
            host: "localhost",
            port: 6379,
            client
          }),
    name: "sessionID",
    resave: false,
    saveUninitialized: false,
    secret: keys.SESSION,
    unset: "destroy",
    cookie: {
      domain:
        process.env.NODE_ENV === "production"
          ? ".client-app.now.sh"
          : "localhost",
      secure: process.env.NODE_ENV === "production",
      httpOnly: true,
      maxAge: 7 * 24 * 60 * 60 * 1000
    }
  })
);

Cors 是用“cors”包设置的:

app.use(
  cors({
    origin:
      process.env.NODE_ENV === "production"
        ? process.env.CLIENT_URL
        : "http://localhost:3000",
    credentials: true
  })
);

客户端配置了 Apollo,HttpLink 中的“凭据”设置为“包含”。

问题是带有会话 ID 的 cookie 在开发中设置正确,但在生产中设置不正确。这可能与我在不同域上托管客户端和服务器有关吗?

【问题讨论】:

  • 我也有同样的问题。我在 Heroku 上托管我的应用程序 + 在 Heroku 上托管我的 NodeJS 服务器。在 localhost cookie 上设置得很好,但由于我将它托管在 Heroku 上,它不会再设置 cookie。我认识到在 NodeJS 中设置了 req.session.cookie,但在客户端浏览器上没有设置 cookie
  • @Jonathan 我的问题与此相同:github.com/expressjs/session/issues/600。这几天我也尝试在 Heroku 上推送前端,但没有成功,所以我最后一次尝试是使用自定义 Nextjs 服务器作为后端的主服务器,并且没有任何额外的配置它可以工作! TL;DR:我将客户端和服务器与他们自己的服务器分开。我也使用客户端服务器作为后端并将其托管在 Heroku 上(因此只有一个域),现在 cookie 可以工作了。不同的子域给了我问题。
  • 顺便说一句,我很高兴这样说:我解决了这个问题!也许这听起来很奇怪,但只需删除 cookie 的 domain 即可。所以不要为你的 cookie 设置域!这对我有用:)

标签: authentication cookies apollo express-session next.js


【解决方案1】:

我的生产节点服务器位于反向代理后面。这会导致节点不信任代理,因此不设置 cookie。

我必须在生产时启用信任第一个代理。

app.set('trust proxy', 1) // trust first proxy

更多信息请查看express-session's docs on the topic.

【讨论】:

  • 这对我有用。在我的笔记本电脑上的 Nginx 上运行 Nest.js,但生产服务器运行的是 Apache,所以必须设置它。
  • 这个答案也对我有用。我正在发送安全的 httpOnly cookie,它在本地运行良好(cookie 已发送,在邮递员中看到),但是当应用程序在 heroku 上运行时它没有被发送。添加此行后,它工作正常。
【解决方案2】:

经过很长时间尝试解决这个问题,我才找到了解决方案:

原来如此,

app.use(session({
  secret: secret,
  saveUninitialized: false,
  resave: false,
  cookie: { 
    domain: clientDomain,
    secure: true
}
}));

我删除了所有 cookie 对象,这解决了我的问题:

app.use(session({
  secret: secret,
  saveUninitialized: false,
  resave: false
}));

浏览器似乎不需要帮助来获取 cookie。

【讨论】:

  • 这是错误的。从 express-session 选项中省略“cookie”仅仅意味着 express-session 将使用默认值发送它的会话 cookie。
  • 我不需要向客户端发送任何特殊的 cookie,所以这解决了我的问题。
猜你喜欢
  • 2019-08-02
  • 2021-07-31
  • 1970-01-01
  • 2021-11-18
  • 2022-01-18
  • 2020-11-24
  • 2017-06-20
  • 2016-02-28
  • 2021-06-21
相关资源
最近更新 更多