我正在学习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的视频中描述了一种可能的解决方案。他在数据库中创建了两个部分:onAuthStateChanged
和users
。 loginQueue
中的用户只能由授权用户读取,users
只能由授权用户写入。对用户进行身份验证后,他的数据将写入loginQueue
。然后,他使用loginQueue
方法检查添加到与其user.uid匹配的on()
的子项,并以某种方式使用loginQueue
方法将用户数据写入{{1} }。这有效,但我不明白如何。如果客户端只能读取update
到users
,那该怎么办?您可以在视频中的7:00看到他的代码。这让我很难过。这有效,但为什么。
我刚刚实现了视频中显示的技术,尽管它对他有用,但在尝试更新唯一可读的用户数据时遇到了update()
错误。这就是我认为应该发生的事情,但在他的视频中,他清楚地表明这并没有发生。除非我遗漏了一些我认为不合适的东西,否则他的方法就不再适用了。也许这是一个后来修复的错误?
更新:感谢Doug Stevenson指出Firebase Cloud Functions。通过创建一个在新用户通过身份验证时响应的云功能,我能够完全解决我的问题。这是我的代码:
users\uid
答案 0 :(得分:2)
这是一种常见的策略。
身份验证不应经常发生。此外,如果自上次写入后用户记录中没有任何变化,则实际上不应发生任何事情。您无需支付客户端写入数据库的带宽。
将您的用户数据分成两部分,一部分可由当前UID写入,另一部分则不可写。这样可以防止用户修改您不喜欢的数据时出现问题。
或者,在数据库中留出另一个位置,客户端可以在其中推送命令以在其他位置更新数据,并使用Cloud Functions for Firebase触发器读取这些命令,使用提升的权限对其执行操作,检查是否正确,并删除它们。