Lau*_*ent 5 firebase firebase-authentication firebase-realtime-database serverless-framework
我将 Firebase Web 用于 SaaS 解决方案。我的目的是随时访问用户的电子邮件,用于发送通知或从后端触发警报。
出于安全原因,Firebase 身份验证不允许列出用户的电子邮件或根据用户 ID 获取电子邮件。因此,当创建用户帐户时,我将电子邮件的副本保存在 Firebase 数据库中的特定集合中。该副本由在用户创建时触发的 Cloud 函数制作(遵循指南:https : //firebase.google.com/docs/auth/extend-with-functions)。
感谢 Firebase 数据库中提供的副本,我可以访问用户的电子邮件。但是,我的问题是当用户更改他的电子邮件时。
Firebase auth 提供了返回承诺的updateEmail函数。我最后使用它来更新 Firebase 身份验证中的电子邮件。然后,当承诺解决时,我会更新 Firebase 数据库中的用户电子邮件。但是,这有一个主要缺点:所有逻辑都在客户端执行,并且由于如果客户端刷新或关闭浏览器(或假设它崩溃),这两个操作都不会在事务中执行,那么 Firebase 身份验证可能是已更新但未更新 Firebase 数据库,从而导致状态不一致。
我查看了文档,希望在更新用户身份验证信息时有可能触发 Cloud 功能。不幸的是,我找不到这样的功能。
我想到的另一个解决方案是从 Web 客户端更新数据库。然后,这最后会触发一个 Cloud 函数,该函数使用admin SDK更新 Firebase 身份验证。最后一个解决方案有效,但绕过了updateEmail执行的检查,以确保新电子邮件不被其他帐户使用。此外,updateEmail执行的帐户劫持保护被驱逐,从安全角度来看,这确实很糟糕。
欢迎任何正确解决此问题的想法。
这里有几个选项:
调用 updateEmail 时,请先更新数据库中的电子邮件,然后再调用 updateEmail。但是,如果发生错误,您需要捕获它并撤消数据库中的更改。
当用户想要更新电子邮件时,请将其 id 令牌和新电子邮件发送到您的服务器或 firebase 函数 http 端点。在那里,您可以使用管理 SDK 验证 ID 令牌,然后使用客户端 SDK require('firebase'),使用 ID 令牌中的 uid,admin.auth().createCustomToken(uid)然后使用客户端 SDK firebase.auth().signInWithCustomToken(customToken)。然后您可以调用user.updateEmail(newEmail)后端并保存电子邮件。
始终仅保存 uid,并仅使用 Admin SDKadmin.auth().getUser(uid)查找用户并获取他们的电子邮件。这可以保证您获得用户的最新电子邮件,因为如果用户选择这样做,您将无法捕获电子邮件撤销。
无需保存任何东西。使用 CLI SDK 下载所有用户及其电子邮件。检查https://firebase.google.com/docs/cli/auth#authexport 这也更好,因为即使他们撤销电子邮件更改,您也始终能够获取每个用户的最新电子邮件。
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |