node.js - 会话存储在 mongoDB 存储中,但在生产期间不存储在浏览器中 [已解决]
问题描述
概述
- 我编写了一个与 Express API 交互的反应应用程序
- 我实现了 oauth2 与快速会话一起进行授权
- 我部署到 Netlify 的客户端 - https://keen-bhaskara-257c68.netlify.app/
- 这是回购:https ://github.com/ThevinSilva/loghorizonServer
- 服务器端到 Heroku - https: //loghorizon-server.herokuapp.com/
- 这是回购:https ://github.com/ThevinSilva/loghorizonClient
- 当前的 cors 设置
//cloudinary
require("dotenv").config();
cloudinary.config({
cloud_name: "loghorizon",
api_key: process.env.CLOUDINARY_API_KEY,
api_secret: process.env.CLOUDINARY_SECRET,
});
require("./config/passport")(passport);
//MongoDB
connectDB();
//---------------------------------- SERVER ----------------------------------
const app = Express();
const httpServer = http.createServer(app);
const io = Socket(httpServer, {
cors: {
origin: process.env.CLIENT_SIDE_URL,
methods: ["GET", "POST"],
allowedHeaders: ["my-custom-header"],
credentials: true,
},
});
app.use(
cors({
origin: process.env.CLIENT_SIDE_URL, // allow to server to accept request from different origin
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
credentials: true, // allow session cookie from browser to pass through
})
);
//---------------------------------- MIDDLEWARE ----------------------------------
// increase bandwidth to allow for base64 strings
app.use(Express.json({ limit: "40mb", extended: true }));
app.use(Express.urlencoded({ limit: "40mb", extended: true }));
app.set("trust proxy", 1);
app.use(
Session({
name: "LHsession",
secret: process.env.COOKIE_SECRET,
resave: true,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
cookie: {
sameSite: false,
maxAge: 8.64e7,
secure: false,
httpOnly: false,
},
})
);
// utility for monitoring requests
app.use(Morgan("dev"));
//---------------------------------- Pasport config ----------------------------------
app.use(passport.initialize());
app.use(passport.session());
问题
该项目在我的开发环境中完美运行(在多台计算机上测试)。引发以下错误: 已被 CORS 策略阻止:没有“访问控制允许来源”...
需要注意的是,除了我被重定向回我的 Web 应用程序会话时,会显示包含帐户的实际授权页面。
我试过的
不言而喻,这些都不起作用
- 我读到添加行 app.set("trust proxy")
app.set("trust proxy", 1);
app.use(
Session({
name: "LHsession",
secret: process.env.COOKIE_SECRET,
resave: true,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
cookie: {
sameSite: false,
maxAge: 8.64e7,
secure: false,
httpOnly: false,
},
})
);
- 在 Axios 我添加了 withCredentials
const server = axios.create({
withCredentials: true,
baseURL: process.env.REACT_APP_SERVER + "/board",
});
- 我阅读了许多线程,这似乎很有希望并且可能会起作用,但我希望客户端和服务器是分开的——在部署到 heroku 和 netlify 后,快速会话不会持续存在
免责声明
- 我是一个 17 岁的业余爱好者,他可能有点过头了,请把我对网络不存在的知识淡化。或许给我一些阅读材料。
- 我检查的环境变量已成功输入
- 文档可能有点奇怪抱歉
- 最终的反应构建中有许多错误和警告,但我认为这在这里无关紧要
解决方案
问题解决了我在我的网站域下注册了这两个,现在它就像一个魅力。没有解决 cors 问题,但仍然设法让我的项目正常工作。此线程上对潜在罪魁祸首进行了更确凿和彻底的调查:跨域会话 Cookie(Heroku 上的 Express API + Netlify 上的 React App)
推荐阅读
- spring-boot - 我正在尝试对我的 springBoot 控制器进行单元测试。但我似乎找不到如何检查参数是否正确
- c# - 多个 Npsql 连接
- spring - 当使用 git 和 redis 作为后端的组合时,Spring 云配置服务器不从 redis 读取属性
- postgresql - PostgreSQL - 查询多维数组
- powershell - 如何在powershell中检查日期格式
- reactjs - 在 Material-UI 的组件 DateRangePicker 中添加按钮或自定义 DateRangePicker
- java - 无法解决 NullPointerException
- graphics - MeshLab“计算点集的法线”中使用的算法是什么
- javascript - 选择多个输入反应不更新 Safari 移动设备中的值
- bash - Fedora 34:将多个命令粘贴到 bash 终端行为更改中