由于安全规则,Firestore 上的“PERMISSION_DENIED”问题

AuthUI.getInstance()如果用户必须注册,我的 Android Java 应用程序首先创建一个 Firebase 帐户(带密码的电子邮件) 。创建帐户后,会出现一个对话框,通知用户他收到了一封验证电子邮件,他必须单击电子邮件中的验证链接。用户完成此操作后,他就可以关闭对话框并继续在 Firestore 中配置他的帐户。

但是对受安全规则保护的 Firestore 文档的所有请求,例如

allow read: if request.auth.uid != null && request.auth.token.email != null && request.auth.token.email_verified == true;

失败

com.google.firebase.firestore.FirebaseFirestoreException:PERMISSION_DENIED:权限缺失或不足

如果用户关闭应用程序,重新启动它并重新验证,那么它的工作(Firestore 请求的权限没有问题)。

我做了几次测试。如果我将安全规则更改为

allow read: if request.auth.uid != null && request.auth.token.email != null;

一切正常,但从我的角度来看它不太安全,因为不保证电子邮件已验证。Firestore 似乎仍然不知道该帐户已通过验证。


倚天杖
浏览 102回答 1
1回答

烙印99

根据谷歌:Firebase 安全规则介于您的数据和恶意用户之间。您可以编写简单或复杂的规则来保护您的应用程序数据,达到您的特定应用程序所需的粒度级别。Firebase 安全规则利用可扩展、灵活的配置语言来定义您的用户可以访问实时数据库、Cloud Firestore 和 Cloud Storage 的哪些数据。Firebase 实时数据库规则在规则定义中利用 JSON,而 Cloud Firestore 安全规则和适用于云存储的 Firebase 安全规则利用一种独特的语言来适应更复杂的规则特定结构。这是您的主要问题:如果用户未经过帐户验证,您将执行一些 Firestore 相关任务。但是,如果他未经过验证,您会再次收到来自 Firestore 的电子邮件。但是您的安全规则描述了除非您经过帐户验证,否则您不应该能够访问数据库。这就是代码失败的地方。这是你的错误:void performEmailVerification() {    if (firebaseAuth.getCurrentUser().isEmailVerified()) {        // Everything is OK, perform your task        checkSomethingOnFirestore();        return;    }        //User not verified, but you still get a database reference and try to get the email.    final DocumentReference documentReference = ... //Error produced 您需要先执行验证,确认用户已通过验证,然后尝试访问数据库。另一个因素可能是您需要刷新您的 firebase 帐户对象,如下所示:FirebaseAuth.getInstance().getCurrentUser().reload();这样做是为了刷新您的帐户状态。因为 firebase 保留对您帐户的引用并且该引用被缓存,所以重新加载您的帐户是一个有用的想法,因此它会被更新。if在检查用户是否经过验证的语句之前执行此操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java