Firebase 安全规则检查新数据的值以进行身份​​验证

Firebase security rule checking value of new data to authenticate

我开始使用 firebase 为我的移动应用编写安全规则。我现在有以下安全规则

{
    "rules": {
        ".read": "auth != null",
        ".write": "auth != null || newData.child('appSecret').val() === '123'",
        "queue": {
          "tasks" : {
            ".indexOn": "_state"
          }
        }
    }
}

在写入规则中,我正在检查 auth 数据是否不为空,或者正在插入的数据是否包含预先确定的应用程序机密。规则的第二部分是向 firebase-queue 添加任务以从服务器获取自定义令牌以对移动应用程序用户进行身份验证。一旦我为应用程序添加其他规则,我会将此规则移动到 /queue/tasks

我现在无法使用上述规则将任务添加到队列中。我尝试在模拟器中写入并得到以下输出。

Attempt to write {"appSecret":"123","task":"GET_AUTH_TOKEN"} to /queue/tasks/23232 with auth=null
    /:.write: "auth != null || newData.child('appSecret').val() === '123'"
        => false
    /queue
    /queue/tasks
    /queue/tasks/23232:<no rules>

No .write rule allowed the operation.
Write was denied.

为什么插入的数据appSecret设置为123时写入操作被拒绝?

Frank 回答后更新

安全性不仅在于插入的校验数据,还在于插入的位置。因此,在我上面的规则中,我想说的是,当您在 / 处插入数据时,请确保用户已通过身份验证,或者插入的数据包含子项 appSecret,其值设置为123 并且我正在尝试在位置 /queue/tasks/23232 插入数据。所以,基本上我在 / 插入的是

{
  'queue': {
    'tasks': {
      '23232': {
        "appSecret":"123",
        "task":"GET_AUTH_TOKEN"
      }
    }
  }
}

因此,插入的新数据不包含值为 123 的子 appSecret。我将规则更新为

{
    "rules": {
        ".read": "auth != null",
        "queue": {
          "tasks" : {
            "$taskId" : {
              ".write": "newData.child('appSecret').val() == '123'",
            },
            ".indexOn": "_state"
          }
        }
    }
}

并且写入操作被允许。当然,现在您还需要为数据库中的其他位置添加 write 规则,因为使用上述规则,任何其他位置都不允许使用 write

您正在尝试将 {"appSecret":"123","task":"GET_AUTH_TOKEN"} 写入路径 /queue/tasks/23232。所以你最终写 123/queue/tasks/23232/appSecret.

您的 / 写入规则规定用户必须经过身份验证或新数据必须包含 /appSecret 且值为 123。由于情况并非如此,因此写入被拒绝。