用户只能链接到给定提供商

时间:2018-02-15 04:43:39

标签: firebase firebase-authentication google-cloud-firestore angularfire2

我正在构建一个应用程序,其中用户可以匿名登录,之后可以选择使用Google或Facebook登录。我已按照 firebase site this post 中提到的步骤进行了操作,但仍然收到错误,内容为 -

  

代码:“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(() => {

    });
  }
}

正如其他帖子中提到的那样,我已经使用linkWithCredential方法传递了必需的idToken/accessToken但是它无法链接两个提供商的帐户,因此最终在身份验证下创建了多个帐户 - &GT;用户

有人可以指出我正确的方向还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以轻松地将匿名身份验证用户转换为paermanent帐户。

查看文档here了解更多详情。我相信为了实现这一点,您必须修改您的身份验证设置,以允许用户从多个帐户登录。

答案 1 :(得分:1)

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