【问题标题】:Firestore security rule doesn't detect phone number from token when on real device在真实设备上时,Firestore 安全规则不会从令牌中检测电话号码
【发布时间】:2021-03-25 07:55:24
【问题描述】:

我遇到了一个问题,即 Firestore 安全规则无法根据电话号码过滤掉用户。该规则设置得很完美,它在模拟器上运行良好,但当我在真实设备上测试时却不行。

我有一组管理员,其中文档 ID 是电话号码。我的安全规则检查用户的电话号码是否存在于集合中,如果存在则返回 true。我已经按照here的答案设置如下-

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin() {
        return exists(path("/databases/" + database + "/documents/admins/" + request.auth.token.phone_number));
    }
    
    match /tasks/{task=**} {
      allow read: if request.auth.uid != null;
      allow create: if isAdmin();
      allow delete: if isAdmin();
      allow update: if request.auth.uid != null;
    }
  }
}

上述 sn-p 中的创建和删除规则在我在模拟器上尝试时获得批准,但在我在真实设备上测试时失败。我还必须提到,如果我将过滤器从电话号码更改为 uid,并将集合中的文档 id 更改为 uid,则以这种方式在真实设备上运行良好-

return exists(path("/databases/" + database + "/documents/admins/" + request.auth.uid));

感觉无法从auth读取token的值。我正在使用 flutter 包进行 firebase auth 和 firestore 发送请求

【问题讨论】:

  • 你能解决这个问题吗?
  • 嘿,我已经发布了我的问题的答案。如果这对您也有帮助,请告诉我。

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


【解决方案1】:

已解决:

问题是 Firestore 规则无法解析国家代码中的“+”符号。因此,这无法验证 ID 为“+919876543210”的文档是否存在,例如(对于印度国家代码 +91)。我所要做的就是去掉“+”符号,同时在管理集合中制作文档,如下所示:

并且在像这样检查规则时手动替换符号:

    function isAdmin() {
        return exists(path("/databases/" + database + "/documents/admins/" + request.auth.token.phone_number.replace('\\+', '')));
    }

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2020-11-03
    • 2021-04-25
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2021-02-11
    • 2020-08-06
    相关资源
    最近更新 更多