将用户添加到Firebase数据库

时间:2017-07-23 03:23:02

标签: firebase firebase-realtime-database firebase-authentication firebaseui

我正在学习Firebase并使用它创建我的第一个项目。我正在使用FirebaseUI来简化身份验证。我现在正在研究数据库,我需要先将经过身份验证的用户添加到其中。我已经阅读了所有文档,我能够做到这一点,但我想知道我是否采用最佳方式。

由于我正在使用FirebaseUI,而我实际上并没有亲自调用Firebase身份验证的signIn()createUser()方法,因此我认为添加用户的最佳方式是{ {1}}

onAuthStateChanged()

这很好但我关心两件事:

1)每次用户通过身份验证时,即使用户已经存在且没有任何更改,也会设置用户数据。简单的页面重新加载会将用户重写为数据库。

2)为了使其工作,userRef位置需要由用户写入。这意味着userRef位置中的usersRef = rootRef.child('users') firebase.auth().onAuthStateChanged(user => { if (user) { let userRef = usersRef.child(user.uid) userRef.set({ name: user.displayName, email: user.email, photoURL: user.photoURL, emailVerified: user.emailVerified, }) } } 不可靠,因为用户可能会自己修改它。我可以依靠用户永远无法修改的emailVerified返回的emailVerified,但我想知道我是做错了还是有更好的方式。

https://www.youtube.com/watch?v=QEd2lEoXpp40的视频中描述了一种可能的解决方案。他在数据库中创建了两个部分:onAuthStateChangedusersloginQueue中的用户只能由授权用户读取,users只能由授权用户写入。对用户进行身份验证后,他的数据将写入loginQueue。然后,他使用loginQueue方法检查添加到与其user.uid匹配的on()的子项,并以某种方式使用loginQueue方法将用户数据写入{{1} }。这有效,但我不明白如何。如果客户端只能读取updateusers,那该怎么办?您可以在视频中的7:00看到他的代码。这让我很难过。这有效,但为什么。

我刚刚实现了视频中显示的技术,尽管它对他有用,但在尝试更新唯一可读的用户数据时遇到了update()错误。这就是我认为应该发生的事情,但在他的视频中,他清楚地表明这并没有发生。除非我遗漏了一些我认为不合适的东西,否则他的方法就不再适用了。也许这是一个后来修复的错误?

更新:感谢Doug Stevenson指出Firebase Cloud Functions。通过创建一个在新用户通过身份验证时响应的云功能,我能够完全解决我的问题。这是我的代码:

users\uid

1 个答案:

答案 0 :(得分:2)

这是一种常见的策略。

  1. 身份验证不应经常发生。此外,如果自上次写入后用户记录中没有任何变化,则实际上不应发生任何事情。您无需支付客户端写入数据库的带宽。

  2. 将您的用户数据分成两部分,一部分可由当前UID写入,另一部分则不可写。这样可以防止用户修改您不喜欢的数据时出现问题。

  3. 或者,在数据库中留出另一个位置,客户端可以在其中推送命令以在其他位置更新数据,并使用Cloud Functions for Firebase触发器读取这些命令,使用提升的权限对其执行操作,检查是否正确,并删除它们。