Javascript 部署到heroku时,texpress会话未在react应用程序中设置cookie
我无法使用我的MERN stack应用程序在浏览器中设置会话cookie。当express服务器和react前端都在本地运行时,Cookie设置为无问题。在我将express后端部署到heroku之后,问题就出现了。我尝试将“sameSite”cookie选项设置为“lax”或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
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配置中的域
&路径
选项
:表示cookie的域的字符串(无默认值)domain
:一个字符串,指示cookie的路径(/默认)path
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。 你可以在这里或这里阅读更多关于它的信息