保持Firebase身份验证与数据库

时间:2017-07-03 21:42:04

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

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

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

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

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

我查看了文档,期望在更新用户身份验证信息时触发云功能的可能性。不幸的是,我找不到这样的功能。

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

欢迎任何妥善解决此问题的想法。

1 个答案:

答案 0 :(得分:2)

以下是几个选项:

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

  2. 当用户想要更新电子邮件时,请将其ID令牌和新电子邮件发送到您的服务器或firebase函数http端点。在那里,您使用admin 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 这也更好,因为即使他们撤销电子邮件更改,您也始终能够获得每位用户的最新电子邮件。