Javascript 使用Angularifre登录时,如何不覆盖FireStore中的用户数据以返回用户?

Javascript 使用Angularifre登录时,如何不覆盖FireStore中的用户数据以返回用户?,javascript,firebase,google-cloud-firestore,firebase-authentication,angularfire,Javascript,Firebase,Google Cloud Firestore,Firebase Authentication,Angularfire,我正在使用AngularFire auth,当用户登录时,它将创建一个用户文档 async googleSignin() { const provider = new firebase.auth.GoogleAuthProvider(); const credential = await this.afAuth.signInWithPopup(provider); return this.createUserData(credential.user); } private createUserD

我正在使用AngularFire auth,当用户登录时,它将创建一个用户文档

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;
  }
[...]
请参阅和文档

不过,我有点担心代码中的安全性。如果您没有正确的firestore规则,那么从前端创建这样的用户文档可能会有问题。确保有一个规则,例如

match /user/{userId} {
  allow read, write: if request.auth.uid === userId
}

否则任何用户都可能覆盖任何其他用户的配置文件信息

您似乎只需要检查该用户是否已经存在

像这样的事情应该可以做到:

private async createUserData(user: any) {
  this.userDoc = this.afs.doc(`users/${user.uid}`);
  const documentSnapshot = await userDoc.get()

  if (documentSnapshot.exists) {
    return;
  }
[...]
请参阅和文档

不过,我有点担心代码中的安全性。如果您没有正确的firestore规则,那么从前端创建这样的用户文档可能会有问题。确保有一个规则,例如

match /user/{userId} {
  allow read, write: if request.auth.uid === userId
}

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

嘿,谢谢你的回答。尝试了它,但在“documentsnapshot.exists”上遇到错误错误:属性“exists”在类型“Observable”上不存在。Ahh尝试了DoumentReference和toPromise中的示例,结果成功了!谢谢你帮助我学习新东西。干杯嘿,谢谢你的回答。尝试了它,但在“documentsnapshot.exists”上遇到错误错误:属性“exists”在类型“Observable”上不存在。Ahh尝试了DoumentReference和toPromise中的示例,结果成功了!谢谢你帮助我学习新东西。干杯