我有两种方法在Firebase中注册用户:通过电子邮件和通过Google Sign in。
我通过电子邮件执行用户注册,如下:
signUp() {
const auth = getAuth();
const db = getFirestore();
createUserWithEmailAndPassword(
auth,
this.createEmail,
this.createPassword
).then(
(userCredential) => {
const user = userCredential.user;
this.$router.push("/");
addDoc(collection(db, "users"), {
email: this.createEmail,
name: this.createName,
});
},
);
},
换句话说,除了将用户保存在Firebase Authentication中,我还将他们的姓名和电子邮件发送到Firestore。这是我的第一个问题:
- 这是保存用户名和将来仍将添加到其中的数据的最有效方法吗?
最后,通过Google登录完成如下操作:
googleSignIn() {
const auth = getAuth();
const provider = new GoogleAuthProvider();
signInWithPopup(auth, provider)
.then((result) => {
this.$router.push("/");
addDoc(collection(db, "users"), {
email: result.user.email,
name: result.user.displayName,
});
})
},
这里出现了一个问题,因为如果用户在Firebase认证中多次登录,一切都是正常的,但在Firebase Firestore中,每次新登录Google都会创建一个用户。
- 如何处理在Firestore中存储用户的问题,特别是来自Google Login的用户?
首先,我将router.push()
语句移动到addDoc()
下面,这样我就可以确认文档已经添加,然后用户被重定向到其他页面。在谷歌签到的情况下,你可以检查如果用户是新的访问isNewUser
属性通过获取额外的信息。如果为true,则将文档添加到Firestore,否则重定向到dashboard:
signInWithPopup(auth, provider)
.then(async (result) => {
// Check if user is new
const {isNewUser} = getAdditionalUserInfo(result)
if (isNewUser) {
await addDoc(collection(db, "users"), {
email: result.user.email,
name: result.user.displayName,
});
}
this.$router.push("/");
})
将文档ID设置为用户的Firebase Auth UID而不是使用生成另一个随机ID的addDoc()
可能是一个好主意,因此更容易编写安全规则。试着这样重构代码:
signInWithPopup(auth, provider)
.then(async (result) => {
// Check if user is new
const {isNewUser} = getAdditionalUserInfo(result)
const userId = result.user.uid
if (isNewUser) {
await setDoc(doc(db, "users", userId), {
email: result.user.email,
name: result.user.displayName,
});
}
this.$router.push("/");
})