Firebase实时数据库匿名用户安全规则配置与请求问题排查
- 数据存储在Firebase Realtime Database,数据结构为
destinations节点下按用户uid分节点存储对应数据。 - 初始使用的全局读权限规则可正常请求,但会触发Firebase安全规则告警,初始规则如下:
{ "rules": { ".read": "auth.uid !== null", ".write": "false", } }
- 业务仅需读取数据,先通过前端SDK获取用户身份令牌:
const accessToken = await user.getIdToken();
- 初始请求拼接的URL格式如下,可正常返回数据但存在安全风险:
https://discover-planets-to-visit-default-rtdb.europe-west1.firebasedatabase.app/${query}.json?auth=${accessToken}
为收紧权限,将安全规则修改为按uid匹配的细粒度读规则,禁止所有写操作:
{ "rules": { "destinations": { "$uid": { ".read": "auth != null && auth.uid == $uid", ".write": "false" } } } }
同步调整请求URL为以下格式后,请求失败,Postman测试返回HTML页面而非预期JSON:
https://discover-planets-to-visit-default-rtdb.europe-west1.firebasedatabase.app/destinations.json/${uid}?auth=${accessToken}
实际测试使用的完整URL示例:https://discover-planets-to-visit-default-rtdb.europe-west1.firebasedatabase.app/destinations.json/nQhLc86TWHeHhSP7JSuPAJdBKyk1?auth=${accessToken}
故障原因
请求URL的路径格式不符合Firebase Realtime Database REST API规范:.json后缀必须放在完整请求路径的最末尾,错误写法将.json放在了/destinations之后,相当于请求不存在的destinations.json节点下的子路径,服务端无法匹配到对应数据接口,因此返回HTML错误页。
修复方法
调整URL路径,将.json后缀移到完整节点路径的最后,正确格式如下:
https://discover-planets-to-visit-default-rtdb.europe-west1.firebasedatabase.app/destinations/${uid}.json?auth=${accessToken}
调整后请求会正确命中/destinations/{uid}节点,完全匹配已配置的安全规则,即可正常返回预期的JSON格式数据。
内容的提问来源于stack exchange,提问作者Sandrew94

