Javascript 部署到heroku时,texpress会话未在react应用程序中设置cookie

Javascript 部署到heroku时,texpress会话未在react应用程序中设置cookie,javascript,node.js,reactjs,express,heroku,Javascript,Node.js,Reactjs,Express,Heroku,我无法使用我的MERN stack应用程序在浏览器中设置会话cookie。当express服务器和react前端都在本地运行时,Cookie设置为无问题。在我将express后端部署到heroku之后,问题就出现了。我尝试将“sameSite”cookie选项设置为“lax”或false,但问题仍然存在 以下是我用于express会话的配置 sessionConfig = { secret: process.env.SESSION_SECRET, resave: false, saveUnin

我无法使用我的MERN stack应用程序在浏览器中设置会话cookie。当express服务器和react前端都在本地运行时,Cookie设置为无问题。在我将express后端部署到heroku之后,问题就出现了。我尝试将“sameSite”cookie选项设置为“lax”或
false
,但问题仍然存在

以下是我用于express会话的配置

sessionConfig = {
secret: process.env.SESSION_SECRET,
resave: false,

saveUninitialized: true,
cookie: {
  secure: false,
  httpOnly: true,
  expires: expiryDate,
  sameSite: "lax",
},
store: MongoStore.create({
  mongoUrl: process.env.MONGO_CONNECTION_STRING,
}),
}

app.set("trust proxy", 1);
app.use(cors({ origin: true, credentials: true }));
app.use(session(sessionConfig));
编辑:进一步澄清。如果我从浏览器访问我的express应用程序的根路由,即使在部署应用程序时,cookie也会正常设置。(即:如果我键入部署的heroku应用程序的url,则会设置会话cookie)。如果我从本地运行的react前端(使用fetch api)调用部署的后端,则不会设置cookie。这让我觉得它可能与同一个站点cookie选项有关。

我也有同样的问题

您是否查看了cookie配置中的
&
路径
选项

  • domain
    :表示cookie的域的字符串(无默认值)
  • path
    :一个字符串,指示cookie的路径(/默认)
请参阅我的答覆:

你在用CRA吗?您的MERN应用程序是否存在于Monorepo中

修正:

1.将react应用程序与服务器捆绑在一起

const express = require('express');
const path = require('path');
const app = express();
const PORT = 9000;

// You'll need to path join to your react build directory
app.use(express.static(path.join(__dirname, 'build')));

app.get('/', function (req, res) {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.listen(PORT);
2.使用JWTs维护基于令牌的会话

我想说,这种方法将更加稳健。然而,JWT并非在所有情况下都是理想的,但在大多数情况下都应该是足够的

如果您有一个monorepomern代码库,您决定使用JWTs。然后,您可以在不同的域/平台中部署客户端和服务器

查看我写的关于在Heroku中部署子目录的这篇博文


我意识到问题的根源。这是chrome中的一项安全功能,不允许将sameSite cookie选项设置为none,除非cookie也设置为secure。 你可以在这里或这里阅读更多关于它的信息