Firebase 安全规则:当文档具有特定字段时允许 'get'

Firebase security rules: allow 'get' when document has a specific field

我的用户注册过程是这样的

  1. 在 Stripe 上购买许可证
  2. 之后完成帐户

在 Stripe webhook/cloud 函数中,我们获取有关电子邮件和许可证的信息,并将其存储在 firestore stripe-customers 集合(具有生成的 ID)的新文档中。

之后完成帐户时,我们会询问 email/password,使用 firebase 进行身份验证,然后我们在 firestore customers 集合中创建一个文档(id=uid)

为了检查用户是否拥有有效许可证,我想授予经过身份验证的用户 'read' 使用匹配的电子邮件地址访问 stripe-customer 的权限。所以我想以某种方式检查 customer/uid/email (or auth.token.email) == stripe-customer/id/email

我尝试了以下安全规则,但显然,对于 'read',request 没有 resource 属性.

如何测试文档中 属性 的值?

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /customers/{uid} {
      allow read, write: if request.auth != null && request.auth.uid == uid;
    }
    match /stripe-customers/{id} {
      allow read: if request.resource.data.email == request.auth.token.email;
    }
  }
}

以及一些相关问题:

request.resource 变量包含 updating/creating 文档时文档的未来状态。而是使用 resource.data,它是文档中存储的所有字段和值的映射。

match /stripe-customers/{id} {
  allow read: if resource.data.email == request.auth.token.email;
}

您可以在 documentation 中阅读更多相关信息。


Are there benefits in using uid as document-id versus having a generated id and a document uid property?

取决于用例,在这里我更喜欢用户的身份验证 UID 作为客户集合中的文档 ID,而来自 Stripe 的客户 ID 作为 stripe-customers 集合中的文档 ID。没有任何优势,但从 Firestore .doc('customers' + uid) 获取用户文档比使用 where('userId', '==', uid) 查询更容易。