通过客户端(节点SDK)从Firebase实时数据库读取数据时,权限被拒绝

时间:2019-06-05 09:40:02

标签: node.js firebase-realtime-database firebase-authentication firebase-admin

我试图从Firebase Realtime DB访问一次subscription_id值。 数据结构如下:

/customers/id/subscription_id

我正在客户端:

import app from "firebase/app"
app.initializeApp(config)

app.database().ref(`customers/${sid}/subscription_id`).once('value')
.then(dataSnapshot => {
  console.log(dataSnapshot.val())
})
.catch(err => {
  console.error(err)
})

在Firebase后端上,我将数据库规则设置如下:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid || root.child('users/'+auth.uid).child('roles').hasChildren(['ADMIN'])",
        ".write": "$uid === auth.uid || root.child('users/'+auth.uid).child('roles').hasChildren(['ADMIN'])"
      },
      ".read": "root.child('users/'+auth.uid).child('roles').hasChildren(['ADMIN'])",
      ".write": "root.child('users/'+auth.uid).child('roles').hasChildren(['ADMIN'])"
    },
  }
}

我很快就在云功能中使用uid创建了一个具有自定义admin.creataUser()的用户。是由于此自定义ID导致我被拒绝访问还是规则有问题?

1 个答案:

答案 0 :(得分:0)

我的坏...我昏昏欲睡的大脑整夜都麻木了。在这里嘲笑我的愚蠢!

是的,需要设置正确的数据库引用以按照弗兰克在评论中指出的规则进行访问和覆盖。

现在,使用以下已更正的规则,所有人都可以正常工作:

{
  "rules": {
    "customers": {
      "$uid": {
        ".read": "$uid === auth.uid || root.child('customers/'+auth.uid).child('roles').hasChildren(['ADMIN'])",
        ".write": "$uid === auth.uid || root.child('customers/'+auth.uid).child('roles').hasChildren(['ADMIN'])"
      },
      ".read": "root.child('customers/'+auth.uid).child('roles').hasChildren(['ADMIN'])",
      ".write": "root.child('customers/'+auth.uid).child('roles').hasChildren(['ADMIN'])"
    },
  }
}