从Firebase模拟器切换至生产环境出现CORS错误No 'Access-Control-Allow-Origin'
问题原因与解决方案
你遇到的CORS错误本质是生产环境的云函数请求被拦截,导致响应没有返回Firebase默认的跨域头,按以下步骤逐一排查即可:
- 排查1:确认云函数已正确部署
进入Firebase控制台的「云函数」页面,确认validateReferral函数存在且运行状态正常,触发URL与报错中的https://us-central1-psyche-9e997.cloudfunctions.net/validateReferral完全一致。如果没有部署,先执行firebase deploy --only functions部署函数到生产环境。 - 排查2:添加本地开发域到授权列表
你当前是从http://localhost:1234调用生产服务,需要将该域名加到Firebase Auth的授权域中:
进入Firebase控制台 → 选择对应项目 → 进入「Authentication」→「设置」→「授权网域」,添加localhost:1234到列表中。 - 排查3:开放云函数的公开调用权限
目前Google Cloud默认禁止未授权用户调用云函数,请求被权限拦截时不会返回CORS头,就会触发你看到的报错:
进入Google Cloud控制台 → 选择对应项目 → 进入「Cloud Functions」→ 找到validateReferral函数 → 点击「权限」标签 → 点击「添加主体」→ 主体填写allUsers→ 角色选择「Cloud Functions Invoker」→ 保存。
注意:该配置会允许所有用户调用该函数,如果你的函数要求登录后使用,请确保调用时用户已完成Firebase Auth登录,不需要开放allUsers权限,否则会有安全风险。 - 排查4:核对客户端配置
确认你客户端代码中的firebaseConfig是生产环境的正确配置,projectId与你部署云函数的项目完全一致。
另外你的代码有一处不影响当前问题的优化点:可以将firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL)这行代码移到if判断外,不管是否使用模拟器都生效。
内容的提问来源于stack exchange,提问作者TheNomadicAspie
相关产品推荐
相关产品推荐

