You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:22:37