Firebase Functions模拟器+Axios在Windows与Mac上表现不一致问题
排查建议
1. 验证哈希与Base64编码的跨平台一致性
认证错误的核心可能是auth_cd生成结果不一致,先单独提取编码逻辑在Windows和Mac上运行,确认输出完全相同:
创建测试脚本test-encoding.js:
const { createHash } = require('crypto'); const sharedKey = "abcdefghijklmn"; const randomKey = "opqrstuvwxyz"; const sha256Hex = createHash("sha256").update(sharedKey + randomKey).digest("hex"); const base64Encoded = Buffer.from(sha256Hex).toString('base64'); console.log('SHA256 Hex:', sha256Hex); console.log('Base64 Encoded:', base64Encoded);
分别在Windows和Mac执行node test-encoding.js,对比两个系统的输出。如果结果不一致,可尝试显式指定update的编码为utf8:
createHash("sha256").update(sharedKey + randomKey, 'utf8').digest("hex")
2. 抓包/打印实际请求参数
通过Axios拦截器打印完整请求URL,确认Mac上发送的查询参数与Windows完全一致:
在axios.post前添加拦截器:
axios.interceptors.request.use(config => { const fullUrl = new URL(config.url); Object.entries(config.params).forEach(([key, val]) => fullUrl.searchParams.append(key, val)); console.log('Final Request URL:', fullUrl.href); return config; });
重点检查auth_cd的Base64字符串是否有URL编码差异(比如+是否被转成%2B),Axios默认会对参数做URL编码,需确认跨平台处理逻辑一致。
也可使用Charles或Fiddler抓包,对比Windows和Mac发送的请求头、查询参数的原始内容。
3. 验证代理配置的跨平台兼容性
Mac上的代理处理可能与Windows存在差异,尝试以下调整:
- 将代理认证从对象改为字符串形式:
proxy: { protocol: "https", host: "my.squid.proxy.com", port: 8080, auth: "username:password" // 替换原auth对象 } - 用curl直接测试代理连通性(在Mac终端执行):
curl -x https://username:password@my.squid.proxy.com:8080 -v "https://my.target.api.com?auth_cd=你的base64值&auth_key=opqrstuvwxyz&companyId=myCompany"
如果curl请求成功,说明代理本身没问题,问题出在Axios的代理配置处理;如果curl也失败,检查Mac的代理网络设置(比如系统代理是否影响)。
4. 检查Node.js环境的编码与系统变量
打印Node.js默认编码和系统语言环境,确认跨平台一致:
console.log('Buffer默认编码:', Buffer.defaultEncoding); console.log('系统LANG变量:', process.env.LANG);
确保两个系统的Buffer.defaultEncoding都是utf8,LANG均为UTF-8相关值(比如en_US.UTF-8)。
5. 排除代理影响的测试
暂时注释掉proxy配置,直接请求目标API,看Mac上是否还出现认证错误:
- 如果去掉代理后正常,说明问题出在代理的跨平台处理上,可尝试更换代理客户端(比如用
tunnel包替代Axios内置代理); - 如果仍然错误,说明问题集中在请求参数本身,回到步骤1和2继续排查。
内容的提问来源于stack exchange,提问作者Pekehata
相关产品推荐
相关产品推荐

