【问题标题】:Unhandled Exception: PlatformException(Error performing get, PERMISSION_DENIED: Missing or insufficient permissions., null)未处理的异常:PlatformException(执行获取时出错,PERMISSION_DENIED:缺少权限或权限不足。,null)
【发布时间】:2021-01-10 07:23:09
【问题描述】:

每当应用启动时,就会出现此错误。我认为错误主要出在 saveUserInfoFirestore 函数中。我看到许多其他人的 Firestore 安全规则也有同样的问题,但我尝试了不同的规则,它仍然显示相同的错误。。

final GoogleSignIn gSignIn = GoogleSignIn();
final userReference = Firestore.instance.collection("Users");    
void initState(){
        super.initState();
        pageController=PageController();
        gSignIn.onCurrentUserChanged.listen((gSigninAccount) { ControlSingIn(gSigninAccount); },
            onError: (gError){
                print("Google signin error"+ gError);
            });
        gSignIn.signInSilently(suppressErrors: false).then((gSigninAccount) { ControlSingIn(gSigninAccount); }).
        catchError((onError){
          print("Signin silently error"+ onError);
        });
      }
    
      ControlSingIn(GoogleSignInAccount signInAccount) async{
    
        if(signInAccount != null){
          await saveUserInfotoFirestore();
          setState(() {
            isSignin = true;
          });
        }else{
          setState(() {
            isSignin = false;
          });
        }
    
      }
      saveUserInfotoFirestore() async{
          final GoogleSignInAccount gCurrentuser = gSignIn.currentUser;
          DocumentSnapshot documentSnapshot = await userReference.document(gCurrentuser.id).get();
    
          if(!documentSnapshot.exists){
            final username = await Navigator.push(context, MaterialPageRoute(builder: (context)=>CreateAccountPage()));
    
            userReference.document(gCurrentuser.id).setData({
              "id": gCurrentuser.id,
              "profileName": gCurrentuser.displayName,
              "username": username,
              "url": gCurrentuser.photoUrl,
              "email": gCurrentuser.email,
              "bio": "",
              "timestamp":timestamp
            });
            documentSnapshot = await userReference.document(gCurrentuser.id).get();
    
          }
          currentUser = User.fromDocument(documentSnapshot);
    
      }

这是我正在使用的 Firestore 安全规则:

rules_version = '2';
// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
  match /databases/{database}/documents {
    match /messages/{document=**} {
      allow read, write: if true;
    }
  }
}

【问题讨论】:

  • 如果您最近更改了安全规则,您可以等待一段时间后再检查。
  • 我前一天改过,还是显示错误
  • 您可以尝试使用所有配置断开应用与 Firebase 的连接并重新连接。另外,删除 google services.json 文件并重新安装。

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


【解决方案1】:

您的安全规则仅允许使用此匹配访问名为“消息”的单个集合:

    match /messages/{document=**} {
      allow read, write: if true;
    }

但是,您的代码正在尝试编写一个名为“Users”的不同集合。您会看到权限错误,因为您的规则根本不允许对该集合进行任何访问。您还必须编写另一条规则以允许对该集合进行足够的访问。

我强烈建议全面查看 documentation 的安全规则,以了解如何最好地保护您的应用。

【讨论】:

  • 谢谢!!!向我展示错误!刚刚解决了..
【解决方案2】:

检查您的 googleservices.json 文件是否位于正确的位置。它应该在你的项目>android文件夹>应用程序文件夹>

【讨论】:

  • 是的。 googleservices.jos 在正确的位置。在我使用 saveuserinfotofirebase() 之前,我与 firebase 的连接有效。
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2020-09-06
  • 2020-02-11
  • 2021-12-31
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多