Android でアカウントに複数の認証プロバイダをリンクする

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようにすることができます。ログインに使用した認証プロバイダに関係なく、同じ Firebase ユーザー ID でユーザーを識別できます。たとえば、パスワードを使用してログインしたユーザーが認証情報を Google アカウントにリンクすれば、それ以降はどちらの方法でもログインできるようになります。また、匿名ユーザーが認証情報を Facebook アカウントにリンクすると、それ以降は Facebook にログインしてアプリを使用できるようになります。

準備

アプリに複数の認証プロバイダ(匿名認証も含む)のサポートを追加します。

ユーザー アカウントに認証プロバイダの認証情報をリンクする

既存のユーザー アカウントに認証プロバイダの認証情報をリンクするには:

  1. 任意の認証プロバイダや認証方法を使用してユーザーのログインを行います。
  2. 新しい認証プロバイダのログインフローを行います(ただし、いずれかの FirebaseAuth.signInWith メソッドを呼び出す手前まで)。たとえば、ユーザーの Google ID トークン、Facebook アクセス トークン、またはメールとパスワードを取得します。
  3. 新しい認証プロバイダの AuthCredential を取得します。

    Google ログイン
    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    
    Facebook ログイン
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    
    メールとパスワードによるログイン
    AuthCredential credential = EmailAuthProvider.getEmailAuthCredential(email, password);
    
  4. ログインしたユーザーの linkWithCredential メソッドに AuthCredential オブジェクトを渡します。

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "linkWithCredential:onComplete:" + task.isSuccessful());
    
                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }
    
                    // ...
                }
            });
    

    認証情報が別のユーザー アカウントに既にリンクされている場合は、linkWithCredential の呼び出しが失敗します。この場合は、アプリに適した方法でアカウントと関連データの統合を行う必要があります。

    FirebaseUser prevUser = currentUser;
    currentUser = auth.signInWithCredential(credential).await().getUser();
    // Merge prevUser and currentUser accounts and data
    // ...
    

linkWithCredential の呼び出しが成功したら、ユーザーはリンクされた認証プロバイダを使用してログインし、同じ Firebase データにアクセスできるようになります。

ユーザー アカウントから認証プロバイダのリンクを解除する

アカウントから認証プロバイダのリンクを解除することで、ユーザーがそのプロバイダを使用してログインできなくなるようにすることができます。

ユーザー アカウントから認証プロバイダのリンクを解除するには、プロバイダ ID を unlink メソッドに渡します。ユーザーにリンクされている認証プロバイダのプロバイダ ID は getProviderData を呼び出すことで取得できます。

FirebaseAuth.getInstance().getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (!task.isSuccessful()) {
                    // Auth provider unlinked from account
                }
            }
        });

フィードバックを送信...