即使在登录后,firebase中的权限仍缺失或不足

即使在登录后,firebase中的权限仍缺失或不足,firebase,flutter,google-cloud-firestore,firebase-security,facebook-login,Firebase,Flutter,Google Cloud Firestore,Firebase Security,Facebook Login,我使用facebook登录我的应用程序。当用户使用Facebook登录创建时,后端代码以编程方式将该用户转换为emailVerified用户 登录时FirebaseAuth.instance.currentUser给出 User( displayName: Balaji Venkatraman, email: ****@gmail.com, emailVerified: true, // note: Email verified is true isAnonymous: f

我使用facebook登录我的应用程序。当用户使用Facebook登录创建时,后端代码以编程方式将该用户转换为
emailVerified
用户

登录时
FirebaseAuth.instance.currentUser
给出

User(
  displayName: Balaji Venkatraman, 
  email: ****@gmail.com, 
  emailVerified: true,  // note: Email verified is true
  isAnonymous: false, 
  metadata: 
  UserMetadata(
    creationTime: 2021-01-21 16:36:58.098, 
    lastSignInTime: 2021-01-21 16:36:58.099), 
    phoneNumber: null, 
    photoURL: '',
    providerData, [
        UserInfo(
          displayName: Balaji Venkatraman, 
          email: '****@gmail.com', 
          phoneNumber: null, 
          photoURL: '',)
      ], 
    refreshToken: , 
    tenantId: null, 
    uid: sRrazGn8tSWagoD2N3oyCEa92yE2,
  )
在这里,我能够成功登录并且
Emailverified
标志也是正确的。但是创建集合会给出错误提示(我们有一个规则来检查用户的电子邮件验证):

在users/sRrazGn8tSWagoD2N3oyCEa92yE2/userAssessment/food处写入失败:状态{code=PERMISSION\u DENIED,description=Missing或权限不足,cause=null}

这是我的规则

function signedInOrPublic(){
    return request.auth != null && request.auth.uid == userId && request.auth.token.firebase.sign_in_provider != "anonymous" && request.auth.token.email_verified == true;
}
match /userAssessment/{category}{
 allow read, write: if signedInOrPublic();
}

不幸的是,我记不清规则应该如何编写,但您可以尝试一次删除一个逻辑表达式来隔离问题,然后通过谷歌搜索找到正确的编写方法


您确定userId包含用户UID吗?

您的安全规则很可能有问题。函数signedorPublic(){return request.auth!=null&&request.auth.UID==userId&&request.auth.token.firebase.sign_in_provider!=“匿名”&&request.auth.token.email_verified==true;}匹配/userAssessment/{category}{a allow read,write:if signedInOrPublic();}这是我的规则你能在没有规则的环境中重现这个问题吗?不,实际上我需要规则,因为它是一个生产应用程序。因此,如果你尝试使用Firebase emulator或创建另一个项目(用于登台),我无法通过禁用规则进行测试?不,我们不能这样做。它是一个生产应用程序。它还打印UIDI。我认为您需要第二个环境。即使您检测到问题,也不应该在不测试修复程序的情况下直接在生产环境中发布修复程序。