如何解决Angularfire-仅在首次OAuthGoogle,facebook登录时写入Firestore
软件包:
-
"@angular/cdk": "~10.0.0",
-
"@angular/fire": "^6.0.5",
-
"firebase": "^8.0.0",
我有一个将Firebase用作无服务器后端解决方案的Angular应用程序。用户可以使用其Facebook或Google帐户通过Firebase Auth进行注册和登录。他们成功登录后,我将其信息(displayName,createdAt,contactEmail)存储在Firestore中。
这是我使用的方法:
public async googleLogin(): Promise<void> {
try {
const provider = new firebase.auth.GoogleAuthProvider();
const response = await this.afAuth.signInWithPopup(provider);
return this.afStore.create(response.user.uid,{
id: response.user.uid,contactEmail: response.user.email,displayName: response.user.displayName,createdAt: this._userDB.createTimestamp()
}
);
} catch (error) {
return Promise.reject(error);
}
}
但是,我的问题是,每次用户登录时,都会调用此函数,随后先前设置的字段(如displayName,createdAt和contactEmail)将被覆盖。我不知道如果用户是新用户还是只是再次登录,如何检查Firebase Auth。
解决方法
在凭据(您的const response
变量)中,您可以访问response.additionalUserInfo.isNewUser
to know if it is a new user or not。如果为true,则创建用户,否则为空:
public async googleLogin(): Promise<void> {
try {
const provider = new firebase.auth.GoogleAuthProvider();
const response = await this.afAuth.signInWithPopup(provider);
// return an empty promise if user is not new
if (!response.additionalUserInfo.isNewUser) { return Promise.resolve(); }
return this.afStore.create(response.user.uid,{
id: response.user.uid,contactEmail: response.user.email,displayName: response.user.displayName,createdAt: this._userDB.createTimestamp()
}
);
} catch (error) {
return Promise.reject(error);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。