Firebase实时数据库规则配置:防止有效PurchaseToken跨用户重复
解决方法
Firebase安全规则没法直接遍历所有$userId节点去检查某个$purchaseToken是否存在valid: true的记录,得换个思路——用反向索引做快速校验。
步骤1:新增反向索引节点
在数据库里加一个validPurchaseTokens节点,专门存所有标记为valid: true的购买令牌,结构示例:
"validPurchaseTokens": { "xxx-token-123": true, // 键为purchaseToken,值存任意真值即可 "yyy-token-456": true }
步骤2:同步维护反向索引(云函数逻辑)
因为valid字段只能由云函数修改,所以要在云函数里同步维护这个索引:
- 当把某个
purchaseToken的valid设为true时,同时在validPurchaseTokens下添加该令牌的键值对 - 当把
valid设为false时,从validPurchaseTokens里删除对应的令牌条目
步骤3:更新安全规则
现在就能通过反向索引快速完成校验,同时要确保只有当前登录用户能操作自己$userId下的节点,完整规则如下:
{ "purchasetokens": { ".read": false, "$userId": { // 确保只有登录用户能操作自己的节点 ".write": "auth !== null && auth.uid === $userId", "$purchaseToken": { // 核心校验:反向索引里不存在该令牌,才能写入(创建/更新) ".write": "!root.child('validPurchaseTokens').child($purchaseToken).exists()", "valid": { // 禁止客户端修改valid字段,仅云函数可操作 ".write": false }, // 允许写入其他自定义字段(如果有需求) "$other": { ".write": true } } } }, "validPurchaseTokens": { // 仅云函数可修改(云函数用管理员权限绕过规则,这里设为false即可) ".write": false, ".read": false } }
补充说明
- 反向索引的核心是把跨节点的全局校验转换成单节点的存在性检查,符合Firebase规则的性能要求
- 云函数必须使用管理员权限(
admin.database())修改valid字段和反向索引,以此绕过客户端规则限制
内容的提问来源于stack exchange,提问作者ohshit
相关产品推荐
相关产品推荐

