为啥这些 Firestore 规则不适用于 Flutter Firebase 插件?

Posted

技术标签:

【中文标题】为啥这些 Firestore 规则不适用于 Flutter Firebase 插件?【英文标题】:Why are these Firestore rules not working with the Flutter Firebase Plugin?为什么这些 Firestore 规则不适用于 Flutter Firebase 插件? 【发布时间】:2019-04-23 01:38:13 【问题描述】:

我正在使用以下 Firebase 规则:

service cloud.firestore 
    match /databases/database/documents 

        function signedIn() 
            return request.auth.uid != null;
        

        match /exampleCollectionName/exampleDocumentName 
            allow get: if signedIn();
            allow write, list: if false;
        
    

我想阻止未登录用户的获取请求,并允许所有其他用户使用 (包括那些以匿名方式登录的人)。

这是我的飞镖代码,使用 Firebase Flutter 插件:

import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';

Future<void> main() async 
  final FirebaseApp app = await FirebaseApp.configure(
    name: 'firestoreDatabaseExample',
    options: const FirebaseOptions(
      googleAppID: 'xxxxxxxx',
      apiKey: 'yyyyyyyy',
      projectID: 'zzzzzzzz',
    ),
  );

  Firestore firestore = Firestore(app: app);
  await firestore.settings(timestampsInSnapshotsEnabled: true);
  final FirebaseAuth _auth = FirebaseAuth.instance;
  await _auth.signOut();
  FirebaseUser firebaseUser = await _auth.signInAnonymously();
  assert(firebaseUser != null);
  assert(firebaseUser.isAnonymous);
  assert(!firebaseUser.isEmailVerified);
  assert(await firebaseUser.getIdToken() != null);

  final FirebaseUser currentUser = await _auth.currentUser();
  assert(firebaseUser.uid == currentUser.uid);

  DocumentReference docRef =
      firestore.collection('exampleCollectionName').document('exampleDocumentName');

  await docRef.get().then((documentSnaphot) 
    if (documentSnaphot.exists) print('IS WORKING!');
  , onError: (error) 
    print(error);
  );

正如您在上面看到的,我以匿名身份登录并尝试获取文档。但是,代码返回:

"PlatformException(Error performing get, PERMISSION_DENIED: Missing or insufficient permissions., null)"

请帮忙,我做错了什么?

【问题讨论】:

即使我的用户已通过身份验证,我也会收到权限被拒绝错误,我也使用了完全相同的签到规则,但似乎失败了 【参考方案1】:

你必须这样做:

final FirebaseAuth _auth = FirebaseAuth.from(app);

否则,您将登录到由google-services.json 配置文件配置的“默认”应用。

【讨论】:

以上是关于为啥这些 Firestore 规则不适用于 Flutter Firebase 插件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Firestore 可编码支持不适用于此示例

为啥排序规则不适用于子查询中的 xml 路径?

Firestore安全规则奇怪的行为

Firestore 实时更新不适用于 recyclerview

Beta Firebase Firestore 不适用于使用应用引擎的项目

firestore 不适用于 React Native Expo