Firestore安全规则与电话号码有关

时间:2018-08-31 09:29:48

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

我正在尝试在Firebase中设置一些安全规则,但是没有运气。基本上,我需要根据用户的电话号码检查用户是否被阻止的天气。这是我到目前为止的内容:

service cloud.firestore {

  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if exists(/databases/$(database)/documents/access/+17777777777);
    }

    match /globals/{document=**} {
      allow read: if true;
    }

    match /requests/{document=**} {
      allow write: if true;
    }
  }
}

如果我在规则本身中对数字进行硬编码,它将执行应有的功能。如果我使用$(reqest.auth.token.phone_number),则无法使用。

allow read, write: if !exists(/databases/$(database)/documents/access/$(reqest.auth.token.phone_number));

我还按照this question尝试使用get

allow read, write: if get(/databases/$(database)/documents/access/$(reqest.auth.token.phone_number)).blocked == true ||
      get(/databases/$(database)/documents/access/$(reqest.auth.token.phone_number)).data.blocked == true;

我的数据结构如下

access | +17777777777 | blocked = true

我还尝试过翻转结构:

access | blocked | +17777777777 = true

这是来自模拟器的身份验证有效负载

{
  "uid": "19687a6s87d68as7d968as7d9a8sd",
  "token": {
    "sub": "19687a6s87d68as7d968as7d9a8sd",
    "aud": "my-app",
    "email": "",
    "email_verified": false,
    "phone_number": "+17777777777",
    "name": "",
    "firebase": {
      "sign_in_provider": "google.com"
    }
  }
}

3 个答案:

答案 0 :(得分:2)

问题不在$(reqest.auth.token.phone_number)方法中。如this answer中所述,很遗憾,Firestore目前不支持文档路径中的参考字段值,这就是为什么仅硬编码值起作用的原因。

修改

这很奇怪,但是Firestore's example仍然与我上面的回答相矛盾。

答案 1 :(得分:1)

我找到了解决此问题的方法!根据{{​​3}},也可以使用path()函数构造路径。因此,您可以使用字符串串联来手动构建路径:

allow read, write: if exists(path("/databases/" + database + "/documents/access/" + request.auth.token.phone_number));

答案 2 :(得分:0)

如果有帮助,当您的身份验证是电话身份验证时,您的 $uid 将是国际格式的电话号码。

{
  "rules": {
    "users": {
      "$uid" : {
      ".read": "auth != null",
      ".write": "auth != null &&  $uid === auth.token.phone_number"
       }
      }
   }
}