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

时间:2018-12-17 16:30:10

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

我的应用程序在客户端和服务器之间划分。客户端是在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是在开发中正确设置的,而在生产环境中未正确设置。这可能与我将客户端和服务器托管在不同域上有关吗?

2 个答案:

答案 0 :(得分:0)

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

我有,

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。

答案 1 :(得分:0)

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

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

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

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