Firestore安全规则:在获取查询时检查用户输入

时间:2020-10-12 19:10:58

标签: firebase google-cloud-firestore firebase-security

我正在用Firestore创建一个博客。我有两个集合,分别称为usersblogPostsblogPosts中的每个文档都包含namecreatedAtcreatedBypassword(纯字符串)字段。

我想创建一个安全规则,以便客户端只有提供正确的文档password才能访问文档。

根据this link中的一个想法,我写了这样的规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /blogPosts/{postUid} {
        allow write: if 
            request.resource.data.createdBy == request.auth.uid &&
            request.resource.data.name is string &&
            request.resource.data.name.size() > 2 &&
            request.resource.data.name.size() < 32 &&
            request.resource.data.password is string &&
            request.resource.data.password.size() > 5 &&
            request.resource.data.password.size() < 32
      
        allow read: if 
            request.auth != null &&
            request.resource.data.password == resource.data.password // <---- THIS LINE IS NOT WORKING
    }
  }
}

我在操场上遇到了以上规则:Error: simulator.rules line [16], column [8]. Property resource is undefined on object.的错误,因此这意味着我们在resource.data个查询中没有read

如何使用Firebase安全规则实现我的目标,因此只有具有blogPosts密码的客户端才能访问文档?

1 个答案:

答案 0 :(得分:1)

使用安全规则是不可能的(而且也不是完全“安全”的)。客户端应用程序不能简单地在查询中传递一些密码。唯一检查输入的时间是写操作中的文档字段,而不是文档读取。

如果要检查密码,则必须建立某种API端点,并要求调用方将密码提供给该端点。再次提醒您,此密码与您将密码保密的能力一样安全,因为一旦知道该密码(也许只需对应用程序进行反向工程),任何人都可以使用它。