3

私のfirebaseダッシュボードでは、multiple accounts for one emailオプションを設定しました。複数のアカウントプロバイダとメールを一致させるAndroid Firebase

私はアプリケーションで簡単な電子メール、Facebook、およびGoogle Plus認証を持っています。私は私のLoginActivityで、このようにそれらのそれぞれを扱う

グーグルプラス:

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        dialog.dismiss(); 
        if (task.isSuccessful()) { 
         // Sign in success, update UI with the signed-in user's information 
         FirebaseUser user = mAuth.getCurrentUser(); 
         proceed(); 
        } else { 
         // If sign in fails, display a message to the user. 
         Toast.makeText(LoginActivity.this, task.getException().getMessage(), 
           Toast.LENGTH_SHORT).show(); 

        } 

        // ... 
       } 
      }); 
} 

のFacebook:

private void handleFacebookAccessToken(AccessToken token) { 
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); 
    dialog.show(); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        dialog.dismiss(); 
        if (task.isSuccessful()) { 
         // Sign in success, update UI with the signed-in user's information 
         FirebaseUser user = mAuth.getCurrentUser(); 
         proceed(); 
        } else { 
         Toast.makeText(LoginActivity.this, task.getException().getMessage(), 
           Toast.LENGTH_SHORT).show(); 
        } 

       } 
      }); 

} 

シンプルなEメール:

mAuth.signInWithEmailAndPassword(email, password) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        if (task.isSuccessful()) { 
         dialog.dismiss(); 
         proceed(); 
        } else { 
         Toast.makeText(LoginActivity.this, "Wrong email or password", Toast.LENGTH_SHORT).show(); 
         dialog.dismiss(); 
        } 
       } 
      }); 

FacebookとGoogle Plusで同じ電子メールを持っているユーザーに、FacebookとGoogle Plusのどちらも許可できるようにしたいと考えています。

このthis documentationドキュメントは、私がFirebaseAuth.signInWithメソッドをスキップして、これらの関数を呼び出す必要があることを述べている:

AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null); 
mAuth.getCurrentUser().linkWithCredential(credential) 

は今混乱があります。 signInWithメソッドをスキップしたため、getCurrentUserがnullのときにどのように呼び出すことができますか?

ドキュメントには、私が理解していない部分をマージすることも記載されています。

currentUser = auth.signInWithCredential(credential).await().getUser(); 

また、signInWithCredenialはawaitメソッドを持っていません。

これは、Logining後に複数のアカウントを同じメールにリンクする必要があることを意味しますか?

答えて

3

アカウントをリンクするには、既存のセッションが必要です。たとえば、新しいユーザーがGoogleを認証プロバイダとして使用してアカウントを作成するとします。 Googleとユーザーを認証するために

  • 使用GIDSignIn:

    要するに

    は、あなたがする必要があります。これを行うには。

  • GoogleがIDトークンを返します(すべてがうまくいく場合)。
  • GoogleAuthProvider資格情報オブジェクトを作成するためにトークンを使用します。
  • そして、この資格情報を使用してFirebaseでsignInWithCredentialを呼び出して認証を行います。

このプロセスは、Facebookなどの他の認証プロバイダと同様です。 Facebookとアカウントをリンクするには、上記の最初の3つのステップ(Facebook authに関する)を行う必要がありますが、 "signInWithCredential"の代わりに "linkWithCredential"を呼び出す必要があります。すべてがうまくいけば、ユーザーはGoogleまたはFacebookで同じアカウントに認証できるようになります。

"signInWithCredential"を呼び出すと、Facebookを認証プロバイダとして使用する新しいアカウントが作成されます。そのため、2つ(またはそれ以上)の認証プロバイダを持つ単一のアカウントにアクセスする代わりに、そのユーザーには各認証プロバイダごとに2つの別々のアカウントがあります。このため、documentationは、FirebaseAuth.signInWithメソッドの呼び出しをスキップする必要があると言います。

マージについての質問については、「資格情報が既に別のユーザーアカウントにリンクされている場合、linkWithCredentialの呼び出しは失敗します。これは、ユーザーが既に認証プロバイダにアカウントを持っていることを意味します。ユーザーが両方のアカウントの情報にアクセスできるようにするには、あるアカウントの情報と別のアカウントの情報をマージするロジックを作成する必要があります。

関連する問題