代码之家  ›  专栏  ›  技术社区  ›  3366784

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

  •  4
  • 3366784  · 技术社区  · 6 年前

    我的安全规则是这样设置的(在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 这使我更加怀疑。

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

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

    方法文件:

    检索firebase身份验证令牌,如果 它已经过期了。备注

    将刷新身份验证令牌(通过建立网络 请求)如果已过期,或者 forceRefresh 是的。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   3366784    6 年前

    事实证明,必须按照上面更新中提到的那样刷新令牌。

    这就是我解决问题的方法。

    首先我刷新身份验证令牌

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

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

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

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

    当我检查邮件是否被证实时 true 但是firestore数据库需要一个刷新的令牌来知道电子邮件已被验证。