繁体   English   中英

Angularfire - 仅在第一次 OAuth(Google、facebook)登录时写入 Firestore

[英]Angularfire - Only write to Firestore on the first OAuth (Google, facebook) login

包裹:

  • "@angular/cdk": "~10.0.0",
  • "@angular/fire": "^6.0.5",
  • "firebase": "^8.0.0",

我有一个 Angular 应用程序,其中 Firebase 作为无服务器后端解决方案。 用户可以使用其 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);
    }
  }

但是,我的问题是,每次用户登录时,都会调用此 function,随后之前设置的字段(如 displayName、createdAt 和 contactEmail)将被覆盖。 如果用户是新用户或只是再次登录,我不知道如何检查 Firebase Auth。

在凭据(您的const response变量)中,您可以访问response.additionalUserInfo.isNewUser 以了解它是否是新用户 如果为真则创建用户,否则什么都不做:

  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);
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM