javascript - Express + Passport + CORS:允许多个域的会话
问题描述
我正在尝试使前端(React JS)与我的后端服务器(Express JS)一起工作。我仍在与CORS作战。前端请求仍被 CORS 阻止。
根据CORS 文档,我已将我的 Express 实例设置cors()
为用作中间件:
const app = express();
// Middlewares
const whitelist = [
'http://localhost:3000',
'http://localhost:3001'
];
const corsOptions = {
origin: function (origin, callback) {
if (whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
}
};
app.use(cors(corsOptions));
如果有人问我为什么要在 localhost 上使用 CORS,是因为我被告知要这样做,因为我必须withCredentials: true
从 axios 请求发送标头以在登录后保持会话。
我只是axios.defaults.withCredentials = true
在前端添加了拦截请求。
在添加更多域之前它的工作方式corsOptions
是设置中间件以让服务器与前端一起工作:
export const setHeaders = (req, res, next) => {
res.header('Access-Control-Allow-Origin', process.env.APP_URL);
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
};
...
app.use(setHeaders);
如果我删除以前的代码,它甚至对一个域都不起作用。
那么,为了让服务器从多个域中获取数据,我必须进行哪些更改?提前致谢。
解决方案
向您的 corsOptions 配置添加credentials
和选项allowedHeaders
credentials: true,
allowedHeaders: ['Origin, X-Requested-With, Content-Type, Accept'],
阅读https://www.npmjs.com/package/cors#configuration-options
此外,您可以使用 127.0.0.1 将域列入白名单,因为您可能希望通过 localhost 或 127.0.0.1 访问它们
完整代码
const app = express();
// Middlewares
const whitelist = [
'http://localhost:3000',
'http://127.0.0.1:3000'.
'http://localhost:3001',
'http://127.0.0.1:3001',
];
const corsOptions = {
credentials: true,
allowedHeaders: ['Origin, X-Requested-With, Content-Type, Accept'],
origin: function (origin, callback) {
if (whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
}
};
app.use(cors(corsOptions));
推荐阅读
- apache-spark - 如何修复 Spark Cassandra 连接器中的读取超时异常
- pyspark - 在 pyspark 中对小数求和并查看整数
- javascript - 如何使用springboot解决聊天框“消息处理方法未处理异常”的问题
- php - hasManyThrough 关系的问题
- r - 自定义背靠背绘图不对齐如何设置面板边距?
- templates - 如何在 Hugo 中按 FilePath 排序内容?
- python-3.x - 阶 (2,1,1) 的 ARIMAX 方程
- mysql - 如何保证查询使用索引?
- c++ - 拆分包含不同大小字符的字符串
- flutter - StreamBuilder 未正确刷新新值