【发布时间】:2017-12-28 21:29:03
【问题描述】:
我正在学习 Firebase 并使用它创建我的第一个项目。我正在使用 FirebaseUI 来简化身份验证。我现在正在处理数据库,我需要首先将经过身份验证的用户添加到其中。我已经阅读了所有文档并且能够做到这一点,但我想知道我是否以最好的方式做到这一点。
由于我使用的是 FirebaseUI,而我自己并没有真正调用 Firebase 身份验证的 signIn() 或 createUser() 方法,我认为添加用户的最佳方法是这样做 onAuthStateChanged()
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,
})
}
}
这很好用,但我担心两件事:
1) 这会在每次用户通过身份验证时设置用户数据,即使用户已经存在并且没有任何更改。一个简单的页面重新加载会将用户重写到数据库中。
2) 为了使其工作,userRef 位置需要用户可写。这意味着 userRef 位置中的 emailVerified 不可靠,因为用户可能自己修改它。我可以只依赖从onAuthStateChanged 返回的emailVerified,用户永远无法修改它,但我想知道是我做错了还是有更好的方法。
https://www.youtube.com/watch?v=QEd2lEoXpp40 上的视频中描述了一种可能的解决方案。他在数据库中创建了两个部分:users 和 loginQueue。 users 中的用户只能由授权用户读取,loginQueue 只能由授权用户写入。当用户通过身份验证时,他的数据被写入loginQueue。然后,他使用on() 方法检查添加到loginQueue 中与他们的user.uid 匹配的孩子,并以某种方式使用update 方法将用户数据写入users。这有效,但我不明白如何。如果 update() 只是可读的,客户端如何能够将 update() 发送到 users\uid?您可以在视频中的 7:00 看到他的代码。这让我很难过。这行得通,但为什么。
我刚刚实现了视频中显示的技术,虽然它对他有用,但在尝试更新唯一可读的用户数据时遇到了PERMISSION_DENIED 错误。这是我认为应该发生的事情,但在他的视频中,他清楚地表明这没有发生。除非我遗漏了一些我认为不是的东西,否则他的方法不再起作用。也许这是后来修复的错误?
更新:感谢 Doug Stevenson 向我介绍 Firebase Cloud Functions。通过创建一个在新用户通过身份验证时响应的云功能,我能够完全解决我的问题。这是我的代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.addUserToDB = functions.auth.user().onCreate(event => {
admin.database().ref('/users/' + event.data.uid).set({
name: event.data.displayName,
email: event.data.email
});
});
【问题讨论】:
标签: firebase firebase-realtime-database firebase-authentication firebaseui