使用 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
}

否则任何用户都可以覆盖任何其他用户的个人资料信息