Firebase API密钥配置HTTP referer限制不生效的原因及解决办法
提问内容
我希望为我的Firebase API设置调用限制,使其仅能被特定域名调用。
我知晓若未配置正确的安全规则,Firestore数据仍可被读取,但按照我的理解,已配置的API限制应当能够阻止未授权调用Firestore API的行为。
我按照要求配置了浏览器密钥的限制,点击保存按钮后等待了5分钟。
随后我对该限制进行测试,打开无痕模式的开发者控制台,复制了和客户端完全一致的Firebase配置,按如下方式调用Firestore API:
var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'https://www.gstatic.com/firebasejs/7.14.1/firebase-app.js'; document.head.appendChild(script); var script2 = document.createElement('script'); script2.type = 'text/javascript'; script2.src = 'https://www.gstatic.com/firebasejs/7.14.1/firebase-firestore.js'; document.head.appendChild(script2); // Your web app's Firebase configuration const firebaseConfig = { apiKey: "exactly_the_same", authDomain: "exactly_the_same", databaseURL: "exactly_the_same", projectId: "exactly_the_same", storageBucket: "exactly_the_same", messagingSenderId: "exactly_the_same", appId: "exactly_the_same" }; // Initialize Firebase firebase.initializeApp(firebaseConfig); const db = firebase.firestore(); db.collection('events').get().then((snapshot) => { snapshot.docs.forEach(doc => { console.log(doc) }) })
我得到的返回结果中包含完整的Firestore数据,可见该限制完全没有生效,请问我哪里操作有误?
更新
经测试发现HTTP referer限制起初仅对非Firestore类API生效,具体原因暂不明确。@willnode的说法正确:需要添加2条URL域名规则(其中一条带通配符)才能将整个域名加入白名单,我在Auth API(匿名登录场景)下测试验证了该规则有效。
通过HTTP Referer限制API密钥是否足够安全的问题,不在本次讨论范围内。
二次更新
后续发现Firestore API的限制生效需要等待更长时间,目前所有限制规则均已正常运行。
解答
你遇到的问题是配置Firebase API域名限制的常见问题,核心原因有两点:
- 白名单规则配置不全
GCP的HTTP referer匹配规则要求必须同时配置根域名和带通配符的规则才能覆盖所有合法请求,仅配置单条规则会出现部分API生效部分不生效的问题。正确的配置格式为:
- 根域名匹配:
https://你的域名.com - 全路径/子域名匹配:
https://*.你的域名.com/*
如果你的站点同时支持HTTP协议,还要额外添加两条HTTP对应的规则。
- 未等待足够的生效时间
Firebase底层依赖GCP全球分布式节点,不同服务的限制规则生效时间存在差异:Auth、云存储等非Firestore类API一般5分钟内即可生效,而Firestore的API限制规则同步全网节点最长可能需要1小时,你仅等待5分钟测试时规则还未完全同步,自然不会生效。
另外补充说明:HTTP referer限制只能作为基础防护手段,无法阻止伪造请求头的恶意调用,核心数据的访问权限建议还是配合Firebase安全规则做最终校验。
内容的提问来源于stack exchange,提问作者bonl
相关产品推荐
相关产品推荐

