Firestore - “权限缺失或不足”,但用户已登录且规则正常

时间:2021-05-28 06:47:43

标签: angular firebase google-cloud-firestore angularfire2 angularfire

我在使用 Firebase 时遇到了一个非常“经典”的错误。

我一登录,就会收到以下消息: “权限缺失或不足。”

不久前它就开始工作了,但我无法重建什么样的代码编辑,破坏了 Firebase 身份验证。唯一有意义的调试想法是激活 Firebase 上的日志记录事件,我也这样做了。

在这里我们可以看到“权限”错误: Logging events - Error

在这里我们可以看到错误是通过访问特定路径产生的:Logging events - Path

路径是:users/ngskrFQaVNMngXM0GO4swjv1lpV2

这里变得很奇怪,因为我检查了我的 Firestore 规则,它们很好。给你:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    // Scoped Functions

    function isAdmin() {
      return isSignedIn() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.admin == true;
    }

    // End Scoped Functions

    // Rules

    match /products/{id} {
      allow read: if true;

      match /prices/{id} {
        allow read: if true;
      }

      match /tax_rates/{id} {
        allow read: if true;
      }
    }
    
    match /videos/{id} {
      allow read: if isSignedIn();
      allow write: if isAdmin();
    }
    
    match /workout-weeks/{id} {
      allow read: if isSignedIn();
      allow write: if isAdmin();
    }
    
    match /workout-exercises/{id} {
      allow read: if isSignedIn();
      allow write: if isAdmin();
    }

    match /users/{uid} {
      allow read, write: if
        belongsTo(uid) || isAdmin() //SEEMS TO FAIL HERE IN FE, BUT WORKS IN BE.
      ;
    }
    
    match /announcements/{id} {
      allow read: if isSignedIn();
      allow write: if isAdmin();
    }
    // End Rules
    
  }
}

// Global Functions
function isSignedIn() {
    return request.auth != null;
}
function belongsTo(uid) {
    return isSignedIn() && request.auth.uid == uid;
}
//function hasMonthlySub() {
    //return request.auth.token.subType == "monthly";
//}
//function hasYearlySub() {
    //return request.auth.token.subType == "yearly";
//}
//function isSubscribed() {
    //return hasMonthlySub() || hasYearlySub();
//}
//function existingData() {
    // return resource.data;
//}

为了确保规则正常工作,我在 Firestore 规则中的操场模式中放置了相同的路径。这是工作。如果用户已登录并且他正在访问自己的个人资料,则该请求应该没问题。在这种情况下,访问配置文件的用户也是管理员,因此无论如何它都应该可以工作。

我唯一怀疑的是用户没有先登录就提出请求。所以我什至尝试记录来自 AngularFireAuth.authState 的事件。没办法...用户已登录: USER IS SIGNED IN

您对如何进一步调试此代码有什么建议吗?

0 个答案:

没有答案
相关问题