【发布时间】: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