未在生产中设置带有快速会话的Cookie

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


认证方式

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

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,但在生产中未正确设置。这可能与我在不同域上托管客户端和服务器的事实有关吗?

神奇斯丁2020/03/27 20:17:08

经过大量时间尝试解决此问题后,我才找到解决方案:

所以我有

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。