Flutter和Firestore在请求中没有用户信息

时间:2018-03-20 04:40:48

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

使用flutter,我已经安装了firebase-authfirestore个软件包,并且能够使用firebase身份验证进行身份验证,并且只要我不这样做就可以打电话进入firestore对用户有任何规则。

我有一个调用_handleEmailSignIn的按钮,我确实收到了有效用户(因为他们在Firebase Auth DB中)

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

final FirebaseAuth _auth = FirebaseAuth.instance;

void _handleEmailSignIn(String email, String password) async {
  try {
    FirebaseUser user = await _auth.signInWithEmailAndPassword(
        email: email, password: password);

    print("Email Signed in " + user.uid);  // THIS works
  } catch (err) {
    print("ERROR CAUGHT: " + err.toString());
  }
}

然后我有另一个按钮调用此函数来尝试将记录添加到testing123集合中。

Future<Null> _helloWorld() async {
  try {
    await Firestore.instance
        .collection('testing123')
        .document()
        .setData(<String, String>{'message': 'Hello world!'});
    print('_initRecord2 DONE');
  } catch (err) {
    print("ERROR CAUGHT: " + err.toString());
  }
}

现在只要我没有关于检查请求用户的任何规则,这就行了。这有效......

service cloud.firestore {
  match /databases/{database}/documents {
    match /testing123auth/{doc} {
        allow read, create
    }
  }
}

当我想确保我使用PERMISSION_DENIED: Missing or insufficient permissions.进行身份验证的用户时,这不会给_handleEmailSignIn

service cloud.firestore {
  match /databases/{database}/documents {
    match /testing123auth/{doc} {
        allow read, create: if request.auth != null;
    }
  }
}

我怀疑firestore请求不包括firebase用户。我是打算将firestore配置为包含用户还是应该自动作为firebase的一部分?

4 个答案:

答案 0 :(得分:2)

要注意的一件事是,文档firebase_core是将所有服务连接在一起的“胶水”,当您使用Firebase身份验证和其他Firebase服务时,需要确保自己从相同的Firebase核心应用配置中获取实例。

final FirebaseAuth _auth = FirebaseAuth.instance;

如果您使用多个Firebase服务,则不应使用上述方式。 相反,您应该始终从FirebaseAuth获取FirebaseAuth.fromApp(app),并使用相同的配置来获取所有其他Firebase服务。

FirebaseApp app = await FirebaseApp.configure(
   name: 'MyProject',
   options: FirebaseOptions(
      googleAppID: Platform.isAndroid ? 'x:xxxxxxxxxxxx:android:xxxxxxxxx' : 'x:xxxxxxxxxxxxxx:ios:xxxxxxxxxxx',
      gcmSenderID: 'xxxxxxxxxxxxx',
      apiKey: 'xxxxxxxxxxxxxxxxxxxxxxx',
      projectID: 'project-id',
      bundleID: 'project-bundle',
   ),
 );
 FirebaseAuth _auth = FirebaseAuth.fromApp(app);
 Firestore _firestore = Firestore(app: app);
 FirebaseStorage _storage = FirebaseStorage(app: app, storageBucket: 'gs://myproject.appspot.com');

这可确保所有服务都使用相同的应用程序配置,并且Firestore将接收身份验证数据。

答案 1 :(得分:1)

firestore不需要为此进行任何特殊配置。

这就是您所需要的。 从Basic Security Rules修改:

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

似乎他们检查uid是否是null而不是auth本身。试试看,看看是否可行。同样,您的代码似乎不一致,因为Firestore规则具有testing123auth,而flutter具有testing123。我不确定这是否是故意的。

答案 2 :(得分:0)

我本打算发表评论,但我的代表还不够。

您找到错误的解决方案了吗?我建议将规则设置为:

service cloud.firestore {
  match /databases/{database}/documents {
   match /testing123auth/{documents=**} {
    allow read, create: if true;
    }
  }
}

或者更好的是,限制用户范围:

service cloud.firestore {
  match /databases/{database}/documents {
    match /testing123auth/{userId} {
      allow read, create: 
        if (request.auth.uid != null &&
            request.auth.uid == userId); // DOCUMENT ID == USERID
      } // END RULES FOR USERID DOC

      // IF YOU PLAN TO PUT SUBCOLLECTIONS INSIDE DOCUMENT:
      match /{documents=**} {
        // ALL DOCUMENTS/COLLECTIONS INSIDE THE DOCUMENT
        allow read, write:
          if (request.auth.uid != null &&
            request.auth.uid == userId);
      } // END DOCUMENTS=**
    } // END USERID DOCUMENT
  }
}

答案 3 :(得分:0)

要检查用户是否已登录,您应该使用

request.auth.uid != null