Files
eSIM-Tools/netlify/functions/_shared/cors.js
Abner 11ba72663a ♻️ refactor: 优化 CORS 处理和 API 响应解析逻辑
- 将 `createHeaders` 默认参数从固定 `ALLOWED_ORIGIN` 改为 `null`,改为由 `resolveCorsOrigin` 函数动态解析来源,统一 CORS 处理入口
- 为 `parseOrigins`、`isAllowedOrigin`、`resolveCorsOrigin` 三个 CORS 工具函数添加 JSDoc 类型注释,提高代码可读性和可维护性
- 代理转发时通过展开运算符条件传递 `X-Session-Token` 请求头,避免转发空字符串导致的鉴权问题
- 修复 URL 代理路径截断问题,保留原始查询字符串拼接,确保后端 API 能正确接收所有参数
- 增加对非 JSON 响应内容的处理分支,直接返回文本内容
2026-05-24 21:18:21 +08:00

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
};