Firebase Firestore 不更新电子邮件验证状态

Posted

技术标签:

【中文标题】Firebase Firestore 不更新电子邮件验证状态【英文标题】:Firebase firestore not updating email verification status 【发布时间】:2018-11-26 10:30:40 【问题描述】:

我的安全规则设置是这样的(在 Firestore 控制台中)。

    service cloud.firestore 
  match /databases/database/documents 
    match /document=** 

      allow read: if request.auth.uid != null && request.auth.token.email_verified;
      allow write: if false; 
    
  

Firebase 自动登录新用户。 因此,最近的用户将拥有一个未经验证的电子邮件地址。

当用户验证他们的电子邮件时,我会在我的应用程序中获得这些结果。

Auth.auth().currentUser?.isEmailVerified // This is true

但是,当我向 firestore 发出请求时,我收到一条错误消息,提示用户没有足够的权限访问该数据。

当我将用户注销然后重新登录时,一切正常。

我最初的想法是可能有一个未刷新的令牌? 但这似乎非常令人困惑,因为我在尝试向 firestore 发出请求之前已经刷新了当前用户。

Auth.auth().currentUser?.reload()

我觉得我错过了什么。

为什么用户注册后强制登录,但邮箱验证状态没有相应更新?

我们必须请求重新认证吗?

如果是这样,强制登录的意义何在?


这让我非常沮丧,因为我不知道应该如何管理我的用户。

登录未经验证的用户是我们应该做的事情吗? 这不会导致安全问题,例如用户制作虚假帐户和向您的应用程序发送垃圾邮件。


更新

我读到了this non swift response,这再次强化了我的怀疑。

我明天要测试这个解决方案,它的快速版本是:

Auth.auth().currentUser?.getIDTokenForcingRefresh(forceRefresh: , completion: )

方法的文档:

检索 Firebase 身份验证令牌,如果出现以下情况,可能会刷新它 它已经过期了。备注

身份验证令牌将被刷新(通过使网络 请求)如果它已经过期,或者如果forceRefresh是YES。

我猜在我的情况下我必须强制刷新,因为令牌不会过期。

【问题讨论】:

【参考方案1】:

事实证明,令牌必须按照上面更新中的说明进行刷新。

这是我解决问题的方法。

首先我刷新授权令牌

Auth.auth().currentUser?.getIDTokenForcingRefresh(true)

如果成功,我会刷新用户。

Auth.auth().currentUser?.reload()

我的问题是我认为重新加载用户会刷新令牌,我没想到事情会不同步。

当我检查电子邮件是否已通过验证时,我得到了true,但 Firestore 数据库需要刷新令牌才能知道电子邮件已通过验证。

【讨论】:

嘿!我有完全相同的问题,我尝试应用您的解决方案,但由于某种原因,它不起作用 - 规则中仍然有 email_verified = false 。您能否提供您使用的 Firebase SDK 版本?谢谢。 @VadimSanko 是的,它是4.10.0。确保您没有线程问题。如果您需要,我可以分享我的代码,或者更好,但您可以分享您的代码。 @VadimSanko getIDTokenForcingRefresh(true) 方法有一个称为后台线程的完成处理程序,您需要在主线程上调度 currentUser?.reload() 方法。如果你不这样做,你的当前用户可能仍然是假的,因为它正在后台线程上刷新。 我有the next code。如何在主线程上运行 reload? 它仍然对我不起作用...您能否分享您围绕此问题的一段代码?

以上是关于Firebase Firestore 不更新电子邮件验证状态的主要内容,如果未能解决你的问题,请参考以下文章

Firebase的新Firestore DB对电子商务Android应用程序来说更贵吗?

删除 SwiftUI 后 Firebase Firestore 不更新 UI

如何更新单个 Firebase Firestore 文档

在 Firestore 和 Firebase Auth 中处理用户数据的最佳方式配置为允许每封电子邮件有多个帐户

使用 StreamBuilder 和从 Firebase Firestore 数据库查询时,ListView 不会更新/获取数据

firebase firestore flutter where 查询