javascript - 使用Angularifre登录时如何不覆盖FireStore中的用户数据以返回用户?
问题描述
我正在使用 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和DocumentSnapshot文档
不过,我有点担心您的代码的安全性。如果您没有正确的 Firestore 规则,那么像这样从前端创建用户文档可能会成为问题。确保有一个规则,例如
match /user/{userId} {
allow read, write: if request.auth.uid === userId
}
否则任何用户都可以覆盖任何其他用户的个人资料信息
推荐阅读
- linux - 如何在我的配置命令中定义 _POSIX_VERSION?
- python - 我的 twitter 机器人、Github 和 Heroku 有问题:我无法在 heroku 中构建它
- c++ - C++ 和字符串文字的歧义处理
- c# - 使用 postSharp 如何在类级别捕获所有方法进入和退出事件?
- javascript - 在单击反应中的下拉列表时保持文本区域的焦点
- html - HTML 表单和输入数据
- javascript - 如何使用函数更改使用 JSON 的响应?
- firebase - 使用 SendGrid 通过 Firebase 发送带有文件附件的电子邮件
- flutter - 未定义名称“OnPress”
- flutter - 如何在 Flutter 中使用 AudioService 插件播放在线广播?