mirror of
https://github.com/Silentely/eSIM-Tools.git
synced 2026-09-06 15:58:25 +08:00
- 将 `createHeaders` 默认参数从固定 `ALLOWED_ORIGIN` 改为 `null`,改为由 `resolveCorsOrigin` 函数动态解析来源,统一 CORS 处理入口 - 为 `parseOrigins`、`isAllowedOrigin`、`resolveCorsOrigin` 三个 CORS 工具函数添加 JSDoc 类型注释,提高代码可读性和可维护性 - 代理转发时通过展开运算符条件传递 `X-Session-Token` 请求头,避免转发空字符串导致的鉴权问题 - 修复 URL 代理路径截断问题,保留原始查询字符串拼接,确保后端 API 能正确接收所有参数 - 增加对非 JSON 响应内容的处理分支,直接返回文本内容
52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
/**
|
|
* CORS 来源解析与校验模块
|
|
* middleware.js 和 server.js 共用,避免逻辑漂移
|
|
*/
|
|
|
|
const DEFAULT_ALLOWED_ORIGIN = 'https://esim.cosr.eu.org';
|
|
|
|
/**
|
|
* 解析 ALLOWED_ORIGIN 环境变量为结构化对象
|
|
* @param {string} allowedOrigin - 逗号分隔的来源列表,支持 * 通配符
|
|
* @returns {{ list: string[], allowAll: boolean }}
|
|
*/
|
|
function parseOrigins(allowedOrigin) {
|
|
const raw = allowedOrigin || DEFAULT_ALLOWED_ORIGIN;
|
|
const list = raw.split(',').map(o => o.trim()).filter(Boolean);
|
|
return {
|
|
list,
|
|
allowAll: list.includes('*')
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 校验请求来源是否在允许列表中
|
|
* @param {string|null} origin - 请求 Origin 头
|
|
* @param {{ list: string[], allowAll: boolean }} origins - 解析后的来源配置
|
|
* @returns {boolean}
|
|
*/
|
|
function isAllowedOrigin(origin, origins) {
|
|
if (!origin) return true;
|
|
if (origins.allowAll) return true;
|
|
return origins.list.includes(origin);
|
|
}
|
|
|
|
/**
|
|
* 根据请求来源解析应返回的 Access-Control-Allow-Origin 值
|
|
* @param {string|null} origin - 请求 Origin 头
|
|
* @param {{ list: string[], allowAll: boolean }} origins - 解析后的来源配置
|
|
* @returns {string} CORS 允许的来源值
|
|
*/
|
|
function resolveCorsOrigin(origin, origins) {
|
|
if (origins.allowAll) return '*';
|
|
if (origin && origins.list.includes(origin)) return origin;
|
|
return origins.list[0] || DEFAULT_ALLOWED_ORIGIN;
|
|
}
|
|
|
|
module.exports = {
|
|
DEFAULT_ALLOWED_ORIGIN,
|
|
parseOrigins,
|
|
isAllowedOrigin,
|
|
resolveCorsOrigin
|
|
};
|