为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2023-05-24 15:29:52
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 似乎仍然不知道该帐户已通过验证。
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

根据谷歌:

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在检查用户是否经过验证的语句之前执行此操作。

查看完整回答
反对 回复 2023-05-24
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信