Firebase firestore未更新电子邮件验证状态

时间:2018-06-17 08:14:52

标签: swift firebase firebase-authentication google-cloud-firestore firebase-security-rules

我的安全规则设置如此(在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为是。

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

1 个答案:

答案 0 :(得分:1)

事实证明,必须刷新令牌,如上面的更新中所述。

以下是我解决问题的方法。

首先我刷新身份验证令牌

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

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

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

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

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