Firebase 实时数据库中的模拟读取被拒绝

Simulated read denied in Firebase Realtime Database

我正在 Firebase 实时数据库 Android 环境中构建一个私人笔记应用程序, 现在,我想在我的应用程序中添加 google 登录的身份验证功能。

到目前为止,我在 'Rules playground' 中尝试了几个规则,但效果不佳。

数据库如下:

{
  "items" : {
    "-MwtOrIBmhaoiGtSjzRl" : {
      "key" : "-MwtOrIBmhaoiGtSjzRl",
      "modifiedAt" : "2022-02-27 04:19:15.782677",
      "string" : "test11"
    },
    "-MwvRBvCJ3hVJS3Qx1M3" : {
      "key" : "-MwvRBvCJ3hVJS3Qx1M3",
      "modifiedAt" : "2022-02-27 13:48:43.081140",
      "string" : "Test2"
    }
  }
}

规则如下:

{
  "rules":{
    "items": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        },
      ".indexOn": "modifiedAt" 
    }
  }
}

在 Rules playground 中,我尝试了 'get' 模拟,结果是 'Simulated read denied'

{
  "auth": {
    "uid": "e41ac05f-6c93-40c8-add6-90bccf8ab80d",
    "token": {
      "sub": "e41ac05f-6c93-40c8-add6-90bccf8ab80d",
      "firebase": {
        "sign_in_provider": "google.com"
      },
      "email": "",
      "email_verified": false,
      "phone_number": "",
      "name": ""
    }
  },
  "resource": {
    "key": "value"
  },
  "path": "/item",
  "method": "get",
  "time": "2022-02-27T14:44:13.766Z",
  "isAdmin": false
}

我能得到一些帮助吗?

一件奇怪的事情是下面的规则也不能正常工作。

{
  "rules":{
    "items": {
      "$uid": {
        ".read": true,
        ".write": true,
        },
      ".indexOn": "modifiedAt" 
    }
  }
}

您在项目下的键值不是 Firebase Auth UID。它们是从您的客户端应用程序代码中随机生成的推送 ID。推送 ID 与添加该数据的人的身份无关。

需要说明的是,这个值:“MwtOrIBmhaoiGtSjzRl”不是 UID。它与您在此处指定的 UID 不匹配:“e41ac05f-6c93-40c8-add6-90bccf8ab80d”。

如果要使用用户的UID作为数据的key添加到数据库中,请不要使用push()。您应该使用 setValue() 在您的代码中使用用户的 UID 构建数据路径,如 documentation.

中所示