如果查询知道他的两个字段,则查找文档 ID,firestore 规则

Find document ID if the query know two of his fields, firestore rules

我正在尽力在我的应用程序中设置一项功能,允许知道群组登录名和密码的人加入。

每个组在“组”集合中都有一个文档,每个用户在“用户”集合中都有一个文档。

为了保留 id 和密码信息,我有另一个名为“AuthGroups”的集合,包含与组一样多的文档,有两个字段:“登录名”和“密码”。每个 auth 文档都具有与 Groups 集合中相应文档相同的 ID。

所以,这是我的策略: 当用户验证登录名和密码时,第一个查询将发送到数据库,以在“AuthGroups”集合中查找具有这些凭据的文档。 如果找到文档,其 ID 将用于在“组”集合中执行另一个查询以检索组的数据。

查询可能如下所示:

var ID = await firestore.collection('AuthGroups')
  .where('login', isEqualTo: login)
  .where('password', isEqualTo: password)
  .get()
  .then((value) {
    return value.docs.first.id;
  });

var groupName = await firestore.collection('Groups')
  .doc(id)
  .get()
  .then((value) {
    return value.get('name');
  });

现在,让我们谈谈如何确保安全的 Firestore 规则... 为了防止恶意的人看到我的“AuthGroup”集合中的所有文档。我告诉自己,我的规则只需要允许包含“登录”和“密码”字段的查询。但我不知道如何正确地做,如果可能的话...... “组”集合中的文档也是如此:用户只有知道其 ID 才能获取文档。

一种解决方案是在我的“AuthGroup”集合中命名我的文档,例如“登录名 + 密码”,并将组的 ID 存储在其中。在我的规则中,只允许这样的列表请求:

service cloud.firestore {
  match /databases/{database}/documents {
    match /AuthGroup/{organization} {
      allow list: if request.auth != null;
    }
  }
}

I told myself that my rules need to only allow queries containing both "login" and "password" fields. But I don't know how to do it right, and if it's even possible.

这不可能。 .

A solution could be to name my documents in my "AuthGroup" collection like "login + password", and store the group's ID in it. And in my rules, allow only list requests like that

是的,这是一个可能的解决方案。或者您可以散列连接的登录名和密码字符串,这样您就不会在文档 ID 中公开它们或超过该 ID 的最大长度。