【问题标题】:Keeping emails synchronized between Firebase auth and database在 Firebase 身份验证和数据库之间保持电子邮件同步
【发布时间】:2017-12-07 05:33:58
【问题描述】:

我将 Firebase Web 用于 SaaS 解决方案。我的目的是随时访问用户的电子邮件,用于发送通知或从后端触发警报。

出于安全原因,Firebase 身份验证不允许列出用户的电子邮件或根据用户 ID 获取电子邮件。因此,在创建用户帐户时,我会将电子邮件副本保存到 Firebase 数据库中的特定集合中。该副本由用户创建时触发的 Cloud 函数制作(遵循指南:https://firebase.google.com/docs/auth/extend-with-functions)。

感谢 Firebase 数据库中的可用副本,我可以访问用户的电子邮件。但是,我的问题是当用户更改他的电子邮件时。

Firebase 身份验证提供了返回承诺的 updateEmail 函数。我最后使用它来更新 Firebase 身份验证中的电子邮件。然后,当承诺解决时,我会更新 Firebase 数据库中的用户电子邮件。但是,这有一个主要缺点:所有逻辑都在客户端执行,并且由于如果客户端刷新或关闭其浏览器(或假设它崩溃),这两个操作都不会在事务中执行,那么 Firebase 身份验证可能是更新但未更新 Firebase 数据库,从而导致状态不一致。

我查看了文档,希望在更新用户身份验证信息时触发 Cloud 功能。很遗憾,我找不到这样的功能。

我想到的另一个解决方案是从 Web 客户端更新数据库。然后,这最后触发了一个 Cloud 函数,该函数使用 admin SDK 更新 Firebase 身份验证。最后一个解决方案有效,但绕过了 updateEmail 执行的检查,以确保新电子邮件不被其他帐户使用。此外,updateEmail 执行的account hijacking protection 被驱逐,从安全角度来看,这确实很糟糕。

欢迎任何正确解决此问题的想法。

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-authentication serverless-framework


    【解决方案1】:

    这里有几个选项:

    1. 调用 updateEmail 时,请先更新数据库中的电子邮件,然后再调用 updateEmail。 T但是,如果发生错误,您需要捕获它并撤消数据库中的更改。

    2. 当用户想要更新电子邮件时,将他们的 id 令牌和新电子邮件发送到您的服务器或 firebase 函数 http 端点。在那里,您使用管理 SDK 验证 ID 令牌,然后使用客户端 SDK require('firebase'),使用来自 ID 令牌的 uid,admin.auth().createCustomToken(uid),然后使用客户端 SDK,firebase.auth().signInWithCustomToken(customToken)。然后您可以在后端调用user.updateEmail(newEmail) 并保存电子邮件。

    3. 始终只保存 uid,只使用 Admin SDK admin.auth().getUser(uid) 查找用户并获取他们的电子邮件。这可以确保您收到用户的最新电子邮件,因为如果用户选择这样做,您将无法捕获电子邮件撤销。

    4. 无需保存任何内容。使用 CLI SDK 下载您的所有用户及其电子邮件。检查https://firebase.google.com/docs/cli/auth#authexport 这也更好,因为即使他们撤消了电子邮件更改,您也将始终能够获得每个用户的最新电子邮件。

    【讨论】:

    • 感谢您的回答。建议 1) 与我所解释的问题相同。例如,浏览器在数据库中的电子邮件更新之后但在调用updateEmail 之前崩溃。关于 2),您的建议很有趣,但正如您稍后提到的,它将无法管理用户可以执行的电子邮件撤销。
    猜你喜欢
    • 2023-03-18
    • 2018-04-01
    • 2018-02-10
    • 2016-12-13
    • 2021-03-26
    • 1970-01-01
    • 2020-11-22
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多