验证现有身份验证用户的电子邮件后更新 Firestore 文档?

Posted

技术标签:

【中文标题】验证现有身份验证用户的电子邮件后更新 Firestore 文档?【英文标题】:Update firestore document after existing auth user's email has been verified? 【发布时间】:2021-04-24 07:47:21 【问题描述】:

我正在尝试让经过身份验证的用户(电子邮件/密码用户)能够更新他们的电子邮件地址。成功验证新的电子邮件地址后,我需要更新位于 users 集合中的用户的 firestore 文档。

我正在这样做:

async updateEmail() 
      const authUser = this.$fire.auth.currentUser
      try 
        await authUser.updateEmail(this.email) // grabbing new email address from UI form
        await this.sendEmailVerification() // sending verification email to new address with action code

        // Here I will log out the user and send them to a new page stating to 
        // check their updated email account for an email verification message
       
        this.$fire.auth.signOut()
        this.$router.replace(name: 'email-confirmation-message')
         catch () 
            console.error(error)
        

问题:只有在新的电子邮件地址得到验证后,我才需要使用以下属性更新用户的文档:

        await this.$fire.firestore
        .collection('users')
        .doc(authUser.uid)
        .update(
        email: this.email,
        emailVerified: true 
        )

在验证电子邮件之前,用户应该无法登录应用程序。用户记录还应包含更新后的电子邮件地址。

是否应该将此逻辑放在 onAuthStateChanged 监听器逻辑、云函数或..?有没有我可以看看的野外例子?

(我还需要牢记安全规则,因为我目前只有具有经过验证的电子邮件地址、已登录并将 doc uid 与 auth uid 匹配的用户。但是,可以相应地调整它...)

谢谢!

【问题讨论】:

我相信这应该放在您的更新电子邮件页面中,因为您无论如何都要退出您的用户,并且 onAuthStateChanged 会对此做出反应。如果您想使用 Cloud Functions,那么您应该删除旧用户并创建一个新用户,该用户拥有旧用户的所有数据。你可以利用onCreate and onDelete triggers with auth for Functions 所以我才意识到我没有真正的理由将用户的电子邮件地址存储在文档中,因为 Auth 已经包含该记录。我将只引用该属性的 Auth。为我解决这个问题!感谢您的帮助。 您能否将其发布为社区参考的答案? 【参考方案1】:

我会考虑通过云函数而不是客户端 API 对用户文档进行这种类型的更改。这是一个有点敏感的操作(更改用户的身份),因此启用/允许更新用户文档我会有点偏执(潜在的安全漏洞)。

我有点惊讶没有onUpdate 触发器for Authentication。这对您的用例来说会很棒。而且我不确定当用户验证他们的电子邮件地址时是否可以编写某种类型的触发器。

【讨论】:

“我有点惊讶没有用于身份验证的 onUpdate 触发器。” => 是的,Cloud Functions for Auth 只有两种触发器:onCreate()onDelete()。一种可能的解决方法是执行计划云功能,定期检查用户配置文件以查看邮件是否已经过验证。不理想,但至少它有效.... 是的,计划的 CF 是一种有效的解决方法,但不是最佳的。 @redshift - 您可能会考虑向 Firebase Auth 提交功能请求? firebase.google.com/support/troubleshooter/contact

以上是关于验证现有身份验证用户的电子邮件后更新 Firestore 文档?的主要内容,如果未能解决你的问题,请参考以下文章

使用 npm 包 googleapis 在对用户进行身份验证后如何获取用户的电子邮件地址?

将电子邮件从身份验证列表发送给Firebase上的所有用户

从 jQuery 中的现有电子邮件和密码数组中验证电子邮件和密码

基于 oauth 的身份验证查询

调用 GenerateChangePhoneNumberTokenAsync() 后身份电子邮件验证不起作用

将 ASP.NET MVC5 身份验证添加到现有项目