336*_*784 9 firebase firebase-security swift firebase-authentication google-cloud-firestore
我的安全规则设置如下(在 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Firebase 自动登录新用户。因此,最近的用户将拥有一个未经验证的电子邮件地址。
当用户验证他们的电子邮件时,我会在我的应用程序中得到这些结果。
Auth.auth().currentUser?.isEmailVerified // This is true
Run Code Online (Sandbox Code Playgroud)
但是当我向 firestore 发出请求时,我收到一条错误消息,指出用户没有足够的权限访问该数据。
当我注销用户然后重新登录时,一切正常。
我最初的想法是,也许有一个没有刷新的令牌?但这似乎非常令人困惑,因为在尝试向 firestore 发出请求之前,我已经刷新了当前用户。
Auth.auth().currentUser?.reload()
Run Code Online (Sandbox Code Playgroud)
我觉得我错过了一些东西。
为什么用户在注册后被强制登录,但他们的电子邮件验证状态没有相应更新?
我们是否必须请求重新认证?
如果是这样,强制登录的意义何在?
这变得非常令人沮丧,因为我不知道我应该如何管理我的用户。
登录未经验证的用户是我们应该做的事情吗?这会不会导致安全问题,例如用户创建虚假帐户和向您的应用程序发送垃圾邮件。
更新
我读到了这个不迅速的回应,这再次加强了我的怀疑。
我明天要测试这个解决方案,它的 swift 版本是:
Auth.auth().currentUser?.getIDTokenForcingRefresh(forceRefresh: , completion: )
Run Code Online (Sandbox Code Playgroud)
该方法的文档:
检索 Firebase 身份验证令牌,如果它已过期,可能会刷新它。评论
如果身份验证令牌已过期或
forceRefresh为 YES ,则会刷新(通过发出网络请求)。
我猜在我的情况下我必须强制刷新,因为令牌不会过期。
事实证明,必须按照上面更新中提到的方式刷新令牌。
这是我如何解决我的问题。
首先我刷新身份验证令牌
Auth.auth().currentUser?.getIDTokenForcingRefresh(true)
Run Code Online (Sandbox Code Playgroud)
如果成功,我将刷新用户。
Auth.auth().currentUser?.reload()
Run Code Online (Sandbox Code Playgroud)
我的问题是我认为重新加载用户会刷新令牌,我没想到事情可能会不同步。
当我检查电子邮件是否已验证时,我收到了true但 Firestore 数据库需要刷新的令牌才能知道电子邮件已验证。
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |