我的安全规则设置如此(在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
为是。
我猜测在我的情况下我必须强制刷新,因为令牌不会过期。
答案 0 :(得分:1)
事实证明,必须刷新令牌,如上面的更新中所述。
以下是我解决问题的方法。
首先我刷新身份验证令牌
Auth.auth().currentUser?.getIDTokenForcingRefresh(true)
如果成功,我会刷新用户。
Auth.auth().currentUser?.reload()
我的问题是,我认为重新加载用户会刷新令牌,我没想到事情可能会不同步。
当我检查电子邮件是否已经过验证时,我得到了true
,但是firestore数据库需要刷新令牌才能知道电子邮件已经过验证。