使用 Angularifre 登录时如何不覆盖 FireStore 中的用户数据以返回用户?
How not to overwrite user data in FireStore for returning user when login using Angularifre?
我正在使用 AngularFire 身份验证,它会在用户登录时创建一个用户文档。
async googleSignin() {
const provider = new firebase.auth.GoogleAuthProvider();
const credential = await this.afAuth.signInWithPopup(provider);
return this.createUserData(credential.user);
}
private createUserData(user: any) {
// Sets user data to firestore on login
this.userDoc = this.afs.doc(`users/${user.uid}`);
const data = {
uid: user.uid,
email: user.email,
displayName: user.displayName,
photoURL: user.photoURL,
instructor: false,
};
return this.userDoc.set(data, { merge: true });
}
这个问题是当返回的用户重新登录时,它将覆盖用户文档。
例如,当用户更改其文档中的个人资料图片时。当他们注销并重新登录时,它将根据签名时设置的数据进行设置。
我不确定这是否是一个明显的逻辑,但我是新手。感谢帮助。
提前致谢。
看来你只需要检查用户是否已经存在。
像这样应该可以解决问题:
private async createUserData(user: any) {
this.userDoc = this.afs.doc(`users/${user.uid}`);
const documentSnapshot = await userDoc.get()
if (documentSnapshot.exists) {
return;
}
[...]
请参阅 DocumentReference and DocumentSnapshot 文档
不过我有点担心您代码的安全性。如果您没有适当的 firestore 规则,那么从前端创建用户文档可能会出现问题。确保有一个规则,例如
match /user/{userId} {
allow read, write: if request.auth.uid === userId
}
否则任何用户都可以覆盖任何其他用户的个人资料信息
我正在使用 AngularFire 身份验证,它会在用户登录时创建一个用户文档。
async googleSignin() {
const provider = new firebase.auth.GoogleAuthProvider();
const credential = await this.afAuth.signInWithPopup(provider);
return this.createUserData(credential.user);
}
private createUserData(user: any) {
// Sets user data to firestore on login
this.userDoc = this.afs.doc(`users/${user.uid}`);
const data = {
uid: user.uid,
email: user.email,
displayName: user.displayName,
photoURL: user.photoURL,
instructor: false,
};
return this.userDoc.set(data, { merge: true });
}
这个问题是当返回的用户重新登录时,它将覆盖用户文档。
例如,当用户更改其文档中的个人资料图片时。当他们注销并重新登录时,它将根据签名时设置的数据进行设置。
我不确定这是否是一个明显的逻辑,但我是新手。感谢帮助。
提前致谢。
看来你只需要检查用户是否已经存在。
像这样应该可以解决问题:
private async createUserData(user: any) {
this.userDoc = this.afs.doc(`users/${user.uid}`);
const documentSnapshot = await userDoc.get()
if (documentSnapshot.exists) {
return;
}
[...]
请参阅 DocumentReference and DocumentSnapshot 文档
不过我有点担心您代码的安全性。如果您没有适当的 firestore 规则,那么从前端创建用户文档可能会出现问题。确保有一个规则,例如
match /user/{userId} {
allow read, write: if request.auth.uid === userId
}
否则任何用户都可以覆盖任何其他用户的个人资料信息