如何在 Firebase 中收到电子邮件验证通知?

Posted

技术标签:

【中文标题】如何在 Firebase 中收到电子邮件验证通知?【英文标题】:How to get notified in Firebase of email verification? 【发布时间】:2021-12-23 05:59:35 【问题描述】:

我想使用 Firebase 身份验证进行电子邮件/密码注册。问题是我只想在使用的电子邮件地址也经过验证时接受用户身份验证。

通常我们可以使用监听器来检查用户何时登录或不再登录:

        Auth.auth().addStateDidChangeListener  (auth, user) in

问题是当用户单击验证电子邮件中的链接时,不会触发此侦听器。只有在创建帐户后才会调用它。

在等待用户点击链接时循环执行以下操作:

        Auth.auth().currentUser!.reload() 
            if !Auth.auth().currentUser!.isEmailVerified 

但问题是我理想情况下想要管理侦听器回调中的所有身份验证内容,但是当电子邮件验证状态发生变化时不使用侦听器。

我有什么遗漏吗?

我知道在移动设备上您可以使用深度链接,因此邮件中的链接会再次打开应用程序,但这不是我想要的,因为用户可以在他们的计算机上打开邮件,所以问题仍然需要解决。

目前我看到的唯一解决方案是自己发送一个 nsnotification 并在我处理所有身份验证代码的地方处理它,但感觉有点混乱。

【问题讨论】:

【参考方案1】:

这里有一些选项:

    设置 启动 RTDB 节点以跟踪用户的emailVerified。 实现您自己的登录页面以进行电子邮件验证:https://firebase.google.com/docs/auth/custom-email-handler 在您的登录页面中,验证用户后,更新该 RTDB 节点中的emailVerified。 在用户发送电子邮件验证的页面上,监听该节点上的更改。更改时,请致电user.reload() 更新用户的emailVerifieduser.getIdToken(true) 以确保令牌已更新为最新声明。

另一种方法是上述方法的变体,即添加一个continueUrl,它将在默认电子邮件验证上显示一个继续按钮,以重定向到您拥有的您知道用户已通过验证的页面。您也可以使用与上述类似的机制,通过该页面上的实时数据库而不是登录页面来传递状态更改。

【讨论】:

这基本上是我通过每秒轮询状态所做的更复杂的变体。似乎没有办法让监听器触发。 轮询是一种低效且昂贵的解决方案。这是使用实时数据库的重点,以避免基于轮询的通知系统,尤其是在移动设备上。 TBH 在这种情况下我并不真正关心效率。它仅在首次注册或用户更改电子邮件地址时发生。如果系统无法应对每秒检查一次的负载,如果在执行此操作时发生了变化,则需要解决更大的问题。这并不是在应用程序的整个生命周期中一直在后台运行。 您可以为所欲为,但这并不能改变轮询效率低下的事实。不保证在注册后立即或立即进行电子邮件验证。在某些情况下,流甚至可能被用户放弃。因此,您将进行很长时间的轮询。这是 Firebase 推荐的解决方案。 这似乎有点复杂。 Firebase 自动登录未经验证的用户。其他网站和应用程序通过限制用户在应用程序中的能力来处理此问题。我认为这是我们在这种情况下应该做的。但即使这样也很复杂,因为您基本上必须为您的应用设计多个状态。

以上是关于如何在 Firebase 中收到电子邮件验证通知?的主要内容,如果未能解决你的问题,请参考以下文章

颤动的firebase身份验证提供者未通知

Firebase 身份验证:通过特殊电子邮件地址(例如 *@gmx.at)发送但未收到的电子邮件

Firebase 通知 Flutter iOS

我希望在 Firebase 实时数据库中添加数据时收到通知

Firebase:用户注册后如何进行电话号码验证?

如何在 Flutter 中使用 Firebase Messaging ^8.0.0-dev.8 收到通知时运行函数?