未在生产中使用 express-session 设置 Cookie

The*_*olf 6 authentication cookies apollo express-session next.js

我的应用程序分为客户端和服务器。Client 是托管在 Now.sh 上的前端 Nextjs 应用程序,Server 是其后端使用 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
    }
  })
);
Run Code Online (Sandbox Code Playgroud)

Cors 是用“cors”包设置的:

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

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

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

Sir*_*sen 5

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

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

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

更多信息请查看express-session关于该主题的文档。


Dar*_*usV 1

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

所以我有,

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

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

app.use(session({
  secret: secret,
  saveUninitialized: false,
  resave: false
}));
Run Code Online (Sandbox Code Playgroud)

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

  • 这是错误的。从express-session选项中省略“cookie”仅仅意味着express-session将发送具有默认值的会话cookie。 (3认同)