Firestore 电话号码的安全规则问题



我试图在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));

根据这个问题,我也尝试了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"
}
}
}

我找到了这个问题的解决方案!根据文档,路径也可以使用 path(( 函数构造。因此,您可以使用字符串串联手动构建路径:

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

问题不在于$(reqest.auth.token.phone_number)方法。如本答案所述,不幸的是,Firestore 目前不支持文档路径中的引用字段值,这就是原因,为什么只有硬编码值有效。

编辑

这很奇怪,但Firestore的例子仍然与我上面的答案相矛盾。

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

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

最新更新