【问题标题】:Firebase Firestore cloud function to watch user email updatedFirebase Firestore 云功能可查看用户电子邮件更新
【发布时间】:2020-04-23 01:29:55
【问题描述】:

作为构建生产应用程序的一部分,我有办法更改用户的电子邮件地址。我这样做是使用

firebase.auth().updateEmail(newEmail);

这很好用,我收到一封电子邮件,说我的电子邮件已更改。我的问题是,我还收到了一个链接,可以让我恢复我的旧电子邮件(一个方便的安全功能等),但这会导致我存储的电子邮件地址不同步的问题。

我将有关用户的信息存储在集合中,当他们使用上述代码更改电子邮件地址时,我也会使用他们的新电子邮件更新集合。

问题是,如果他们单击恢复链接,则电子邮件地址会在用户身份验证方面被重置,但不会在我的收藏中重置。

我一直试图找到的东西是这样的,但我找不到它

functions.auth.user().onEmailChange(async (newEmail, context) =>
{
    admin.firestore().collection(Collections.USERS_PRIVATE).doc(context.params.uid).update({ email: newEmail });
});

这样我就可以镜像我的收藏以始终与用户身份验证电子邮件地址同步。

【问题讨论】:

    标签: node.js firebase firebase-authentication google-cloud-functions


    【解决方案1】:

    我使用 自定义电子邮件操作处理程序Cloud Functions 来处理这个问题。一旦用户验证了他的新身份验证电子邮件地址,我只会调用 Cloud Function 来更新 Firestore 中的电子邮件。因此,您在 Firestore 中将只有有效且经过验证的电子邮件地址。这意味着,如果用户使用firebase.auth().updateEmail(newEmail); 更改了他的电子邮件地址,但决定通过recoverEmail 操作恢复到他的旧身份验证电子邮件,则您无需执行任何操作。

    1. 定义自定义操作网址

    为 Firebase 在 Firebase 控制台中自动发送的电子邮件定义您的自定义操作网址,例如https://example.com/__/auth/action。 Firebase 会将所有必要的属性附加到您的 url,例如 oobCode 以验证有效操作,而 mode 则在:

    • resetPassword,
    • recoverEmail
    • verifyEmail
    1. 编写动作处理程序(参考https://firebase.google.com/docs/auth/custom-email-handler?hl=en
    function handleVerifyEmail(auth, actionCode, continueUrl, lang) {
      // Try to apply the email verification code.
      auth.applyActionCode(actionCode).then(function(resp) {
        // Email address has been verified.
    
        // TODO: Display a confirmation message to the user.
    
        // TODO: Call your Cloud Function to update the email property in Firestore
    
      }).catch(function(error) {
        // Code is invalid or expired. Ask the user to verify their email address
        // again.
      });
    }
    
    
    1. 创建云函数

    使用触发器https.onCallhttps.onRequest创建一个云函数,在成功验证电子邮件后调用它并更新Firestore中的电子邮件字段。

    编辑#1: 尽管此解决方案可行,但我仍然无法在verifyEmail 过程中找到保护云功能的方法,因为用户可能未登录并且我不知道如何检索@987654335 @ 在此步骤中。我用recoverEmail 处理程序尝试了相同的过程,但最终遇到了同样的问题。我为这个安全问题创建了一个post,所以也许你也会从中受益。

    【讨论】:

      【解决方案2】:

      我认为您可以通过使用自定义电子邮件处理程序 (https://firebase.google.com/docs/auth/custom-email-handler) 来做到这一点。正如您在初始更改中所做的那样,这让您可以在用户恢复电子邮件时运行一些额外的代码。

      【讨论】:

      • 欢迎来到 Stack Overflow!您能否在回答中包含一个如何在此问题的上下文中使用此自定义电子邮件处理程序的示例?
      【解决方案3】:

      从 Firebase 身份验证到 Cloud Functions 的唯一两个触发器是首次创建用户帐户时和删除用户帐户时。当用户帐户更新或其他任何事情时,没有触发器。

      这是一个有效的feature request,但目前您必须执行以下操作之一:

      1. 检查客户端代码中的电子邮件地址是否不匹配。
      2. 在 Cloud Functions 中处理电子邮件地址的整个更新。
      3. 定期检查(最近更新)帐户中是否存在 Cloud Functions 中不同步的电子邮件地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 2021-06-18
        • 2019-08-08
        • 2018-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多