云功能,删除Firestore子集合,是否需要AdminToken?

时间:2020-10-29 00:33:46

标签: firebase flutter google-cloud-functions

我正在尝试构建可调用的云函数,当用户删除帖子时,它还会尝试删除评论,这是帖子的子集合。所以我看到了这个例子,并像一个文档例子一样实现了

image0Resized = image0.resize((int(image0Width/2), int(image0Height/2)))

,我成功将定制令牌接收到客户端。但是我现在要做什么?获取令牌后,我从客户端调用了“ recursiveDelete”函数,但发生错误PERMISSION_DENIED

  1. 是否应使用新的自定义管理员令牌初始化接收令牌的用户? (如果我误会让我知道)
  2. 删除这样的子集合时,真的需要管理令牌吗?很难使用,所以我问。

1 个答案:

答案 0 :(得分:0)

对于这种用例,我不认为您确实需要自定义令牌,我建议您使用Firebase Firestore规则,而不是实现自己的基于角色的身份验证。

要遵循的步骤:

1-创建一个可以称为“用户”的集合,并在其中包含该用户可能具有的角色字段,例如“ ADMIN”。此集合中的每个文档ID都可以是firebase auth生成的用户的auth uid。您可以使用currentUser属性从前端获取此uid,并进行了here

的解释

2-使用Firestore规则保护数据库,例如:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // only admins can remove posts
    match /posts/{postID} {
      allow read, write: if isAdmin();
    }

    // only admins can remove comments
    match /comments/{commentID} {
      allow read, write: if isAdmin();
    }

    // this function will check if the caller has an admin role and allow or disallow the task upon that
    function isAdmin() {
      return get(/databases/$(database)/documents/
          users/$(request.auth.uid)).data.role == "ADMIN";
   }

  }
}

3-成功删除后文档后,您可以创建带有onDelete触发器的函数,该函数将被调用,并删除递归的注释子集合,为此,您应该包括以下代码:

const client = require('firebase-tools');

exports.recursiveDelete = functions.firestore
    .document('posts/{postID}')
    .onDelete((snap, context) => {
     .....
     await client.firestore
      .delete(collectionPath, {
        project: process.env.GCLOUD_PROJECT,
        recursive: true,
        yes: true
      });
}