带有身份验证的 Firestore 规则 - Flutter

问题描述 投票:0回答:1

我遇到一个问题,我的 Firebase Firestore 规则拒绝经过身份验证的用户对数据库的请求。我不太熟悉 Firestore 规则,所以这很可能是我做错了。

这是我的 Firestore 规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{userID} {
      allow read: if request.auth.uid == userID;
      allow write: if request.auth.uid == userID
    }
    match /payment_options{
        allow read: if request.auth != null;
      allow write: if false
    }
    match /logs{
        allow read, write: if false
    }
  }
}

检查随附的图片以获取我的 Firestore 数据的快照,其中红线代表从 Firebase 身份验证检索到的用户 ID。

我正在使用 Flutter Firestore 和 Firebase Auth SDK,并且我确保仅在用户登录 flutter 应用程序后获取/设置数据库文档,但我不断收到以下异常:

Exception:
[cloud_firestore/permission-denied] The caller does not have permission to execute the specified
operation.

这是我的应用程序树,它侦听身份验证状态更改,如果用户未登录,则将其路由到登录页面,并在登录后将其路由到主页(Firestore 操作仅在主页之后发生):

class AppTreeWidgetState extends State<AppTreeWidget > {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Auth.currentUserStream,
        builder: (context, snapshot){
          if(snapshot.hasData) {
            //TODO: Tell firebase to use the Signed in user to authenticate requests
            //to the Firestore Database
            return const MainPage();
          } else {
            return const LoginScreen();
          }
        }
      );
  }
}

任何帮助或指示来启动并运行此程序将不胜感激!

我预计 Auth 和 Firestore SDK 会互操作,并且一旦用户使用 Firebase Auth SDK 登录,我的 Firestore 调用就已经经过身份验证 - 我在这里错了吗?我是否需要使用从用户登录中检索到的信息显式授权对 Firestore 数据库的调用?

firebase google-cloud-firestore firebase-authentication firebase-security
1个回答
0
投票

我不确定你是如何打电话的以及你的数据怎么样。 但如果您确定用户已成功通过身份验证,则在调用数据库时无需将其他信息传递给 firebase,因为身份验证状态始终自动附加到请求。

我的建议是使用

{documents=**}
它是一个通配符,可以匹配指定路径中的任何文档。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{userID}/{documents=**}  {
      allow read: if request.auth.uid == userID;
      allow write: if request.auth.uid == userID
    }
    match /payment_options/{documents=**} {
        allow read: if request.auth != null;
      allow write: if false
    }
    match /logs/{documents=**} {
        allow read, write: if false
    }
  }
}

因为我在这里没有看到确切的实现。 如果没有解决,那么您需要提供额外的实施细节。

© www.soinside.com 2019 - 2024. All rights reserved.