Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

C ++を使用して複数の認証プロバイダーをアカウントにリンクする

認証プロバイダーのクレデンシャルを既存のユーザーアカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。ユーザーは、ログインに使用した認証プロバイダーに関係なく、同じFirebaseユーザーIDで識別できます。たとえば、パスワードを使用してログインしたユーザーは、Googleアカウントをリンクし、将来的にどちらの方法でもログインできます。または、匿名ユーザーがFacebookアカウントをリンクし、後でFacebookでサインインして、アプリの使用を継続することもできます。

あなたが始める前に

2つ以上の認証プロバイダー(匿名認証を含む可能性があります)のサポートをアプリに追加します。

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

  1. 任意の認証プロバイダーまたは方法を使用してユーザーにサインインします。
  2. firebase::auth::Auth::SignInWithCredentialメソッドの1つを呼び出すまで、ただしこれを含まない、新しい認証プロバイダーのサインインフローを完了します。たとえば、ユーザーのGoogle IDトークン、Facebookアクセストークン、または電子メールとパスワードを取得します。
  3. 新しい認証プロバイダーのfirebase::auth::Credentialを取得します。

    Googleサインイン
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    
    ログイン
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    
    電子メール-パスワードサインイン
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
    
  4. firebase firebase::auth::CredentialオブジェクトをサインインしたユーザーのLinkWithCredentialメソッドに渡します。

    // Link the new credential to the currently active user.
    firebase::auth::User* current_user = auth->current_user();
    firebase::Future<firebase::auth::User*> result =
        current_user->LinkWithCredential(credential);
    

    クレデンシャルがすでに別のユーザーアカウントにリンクされている場合、 LinkWithCredentialの呼び出しは失敗します。この状況では、アプリに応じてアカウントと関連データのマージを処理する必要があります。

    // Gather data for the currently signed in User.
    firebase::auth::User* current_user = auth->current_user();
    std::string current_email = current_user->email();
    std::string current_provider_id = current_user->provider_id();
    std::string current_display_name = current_user->display_name();
    std::string current_photo_url = current_user->photo_url();
    
    // Sign in with the new credentials.
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // The new User is now active.
    if (result.error() == firebase::auth::kAuthErrorNone) {
      firebase::auth::User* new_user = *result.result();
    
      // Merge new_user with the user in details.
      // ...
      (void)new_user;
    }
    

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

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

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

// Unlink the sign-in provider from the currently active user.
firebase::auth::User* current_user = auth->current_user();
firebase::Future<firebase::auth::User*> result =
    current_user->Unlink(providerId);