用户只能链接到给定提供商的一个身份

Gur*_*Rao 4 firebase firebase-authentication angularfire2 google-cloud-firestore

我正在构建一个应用程序,其中用户可以匿名登录,稍后可以选择使用 Google 或 facebook 登录我已按照firebase 网站这篇文章中提到的步骤进行操作,但仍然收到错误消息 -

代码:“auth/provider-already-linked”,
消息:“用户只能链接到给定提供商的一个身份。”

以下是我的auth.service.ts内容

@Injectable()
export class AuthService {
  user: Observable<User>;
  constructor(private afAuth: AngularFireAuth,
    private afs: AngularFirestore,
    private router: Router) {
    this.user = this.afAuth.authState
      .switchMap(user => {
        if (user) {
          return this.afs.doc<User>(`usersData/${user.uid}`).valueChanges()
        } else {
          return Observable.of(null)
        }
    });
  }

  anonymousLogin(): Promise<any>{
    return this.afAuth.auth.signInAnonymously();
  }

  get authState(): Observable<User>{
    return this.afAuth.authState.map(data => {
      return data;
    });
  }

  get currentUser(): boolean {
    return this.user !== null;
  }

  getCurrentUser(): User{
    return this.afAuth.auth.currentUser;
  }

  googleLogin() {
    const provider = new firebase.auth.GoogleAuthProvider()
    return this.oAuthLogin(provider);
  }

  facebookLogin(){
    const provider = new firebase.auth.FacebookAuthProvider();
    provider.setCustomParameters({
      'display': 'popup'
    });
    return this.oAuthLogin(provider);
  }

  private oAuthLogin(provider) {
    return this.afAuth.auth.signInWithPopup(provider)
      .then((response) => {
        if(this.getCurrentUser() !== null){
          let cred = null;
          if(response.credential.providerId === 'google.com'){
            cred = firebase.auth.GoogleAuthProvider
                   .credential(response.credential.idToken);
          }else if(response.credential.providerId === 'facebook.com'){
            cred = firebase.auth.FacebookAuthProvider
                   .credential(response.credential.authToken);
          }
          firebase.auth().currentUser
          .linkWithCredential(cred).then(function(user) {
            console.log("Anonymous account successfully upgraded", user);
          }, function(error) {
            console.log("Error upgrading anonymous account", error);
          });
        }
        this.updateUserData(response.user)
      });
  }

  private updateUserData(user) {
    const userRef: AngularFirestoreDocument<any> = this.afs.doc(`usersData/${user.uid}`);
    const data: User = {
      uid: user.uid,
      email: user.email,
      displayName: user.displayName,
      photoURL: user.photoURL,
      isAnonymous: user.isAnonymous,
      roles: {
        customer: true
      }
    };
    return userRef.set(data, {merge: true});
  }
  signOut() {
    this.afAuth.auth.signOut().then(() => {

    });
  }
}
Run Code Online (Sandbox Code Playgroud)

正如其他帖子中提到的那样,我使用了linkWithCredential传递 required 的方法idToken/accessToken,但无法链接两个提供商上的帐户,因此最终在Authentication-> Users下创建多个帐户。

谁能指出我正确的方向,还是我在这里遗漏了什么?

boj*_*eil 5

如果您收到auth/provider-already-linked错误代码,则意味着您已经将提供商链接到该用户。您只能链接提供商一次。同一用户不能拥有多个 Facebook 帐户。只有一次。如果您想删除该帐户,则必须取消其链接:firebase.auth().currentUser.unlink(firebase.auth.FacebookAuthProvider.PROVIDER_ID)。然后,您可以将新的 Facebook 凭据链接到该用户。