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

Jor*_*ans 5 ios firebase firebase-authentication

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

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

        Auth.auth().addStateDidChangeListener { (auth, user) in
Run Code Online (Sandbox Code Playgroud)

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

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

        Auth.auth().currentUser!.reload() {
            if !Auth.auth().currentUser!.isEmailVerified {
Run Code Online (Sandbox Code Playgroud)

但是问题是我理想上要​​管理侦听器回调中的所有身份验证内容,但是当电子邮件验证状态更改时不使用侦听器。

我有什么想念的吗?

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

目前,我看到的唯一解决方案是自己发送nsnotification并在我处理所有auth代码的地方进行处理,但感觉有些混乱。

boj*_*eil 5

以下是一些选项:

  1. 设置 RTDB 节点来跟踪emailVerified用户。
  2. 实现您自己的电子邮件验证登陆页面:https://firebase.google.com/docs/auth/custom-email-handler
  3. 在您的登陆页面中,当用户经过验证后,emailVerified在该 RTDB 节点中进行更新。
  4. 在用户发送电子邮件验证的页面上,监听该节点上的更改。发生更改时,调用user.reload()以更新emailVerified用户并user.getIdToken(true)确保令牌已更新为最新的声明。

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

  • 这基本上是我每秒轮询状态所做的事情的更复杂的变体。似乎没有办法让监听器触发。 (3认同)
  • 轮询是一种低效且昂贵的解决方案。这是使用实时数据库的全部目的,以避免基于轮询的通知系统,尤其是在移动设备上。 (3认同)
  • 老实说,我并不真正关心这种情况下的效率。它仅在首次注册时或用户更改电子邮件地址时发生。如果系统无法处理每秒检查一次的负载(检查时是否发生变化),则需要解决更大的问题。这并不是说它在应用程序的整个生命周期中都在后台持续运行。 (2认同)
  • 你可以做任何你想做的事,但这并不能改变轮询效率低下的事实。不保证电子邮件验证立即或在注册后立即进行。在某些情况下,该流程甚至可能被用户放弃。所以你会花很长时间进行投票。这是 Firebase 推荐的解决方案。 (2认同)