C++ を使用して Firebase 匿名認証を行う

Firebase Authentication で一時的な匿名アカウントを作成して使用することで、Firebase で認証できます。一時的な匿名アカウントを使用すると、アプリに登録していないユーザーが、セキュリティ ルールで保護されているデータを使用できるようになります。匿名ユーザーがアプリに登録する場合は、ログイン認証情報を匿名アカウントにリンクすると、それ以後のセッションでも引き続き、保護されているデータを使用できます。

はじめに

  1. Firebase を C++ プロジェクトに追加します
  2. アプリを Firebase プロジェクトに接続していない場合は、Firebase コンソールで接続します。
  3. 匿名認証を有効にします。
    1. Firebase コンソールで [Auth] セクションを開きます。
    2. [Sign-in method] ページで [匿名] を有効にします。
    3. 省略可: プロジェクトを Firebase Authentication with Identity Platform にアップグレードした場合は、自動クリーンアップを有効にできます。この設定を有効にすると、30 日以上経過した匿名アカウントは自動的に削除されます。自動クリーンアップが有効になっているプロジェクトでは、匿名認証が使用量上限または請求の割り当てに対してカウントされなくなります。自動クリーンアップをご覧ください。

Firebase で匿名で認証を行う

ログアウトしたユーザーが Firebase での認証が必要なアプリ機能を使用する場合は、次の手順に沿って匿名によるユーザーのログインを行います。

すべての API 呼び出しは Auth クラスを使用して行われます。
  1. Auth ヘッダー ファイルと App ヘッダー ファイルを追加します。
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. 初期化コードで firebase::App クラスを作成します。
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
  3. firebase::Appfirebase::auth::Auth クラスを取得します。AppAuth は、1 対 1 で対応しています。
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
  • Auth::SignInAnonymously を呼び出します。
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAnonymously();
  • 定期的に(たとえば、毎秒 30 回または 60 回)実行される更新ループがプログラムに含まれている場合、Auth::SignInAnonymouslyLastResult を使用して、更新されるたびに 1 回結果を確認できます。
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAnonymouslyLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    プログラムがイベント ドリブンの場合は、Future にコールバックを登録することをおすすめします。
  • 匿名アカウントを永久アカウントに変換する

    匿名ユーザーがアプリへ登録した後、新しいアカウントの下で引き続き従来の作業を行えるようにしなければならない場合があります。たとえば、アプリへの登録前にユーザーがショッピング カートに追加したアイテムを、新しいアカウントのショッピング カートにも入れておく、といったケースです。これを行う手順は次のとおりです。

    1. ユーザーがアプリに登録したら、ユーザーの認証プロバイダのログインフローを行います(ただし、いずれかの Auth::SignInWith メソッドを呼び出す手前まで)。たとえば、ユーザーの Google ID トークン、Facebook アクセス トークン、メールアドレスとパスワードを取得します。
    2. 新しい認証プロバイダの auth::Credential を取得します。

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

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

    LinkWithCredential の呼び出しが成功したら、ユーザーの新しいアカウントが匿名アカウントの Firebase データにアクセスできるようになります。

    自動クリーンアップ

    プロジェクトを Firebase Authentication with Identity Platform にアップグレードした場合は、Firebase コンソールで自動クリーンアップを有効にできます。この機能を有効にすると、Firebase では 30 日以上経過した匿名アカウントが自動的に削除されます。自動クリーンアップが有効になっているプロジェクトでは、匿名認証は使用量上限または請求の割り当てに対してカウントされません。

    • 自動クリーンアップを有効にしてから作成した匿名アカウントはすべて、作成後 30 日が経過すると自動的に削除されます。
    • 既存の匿名アカウントは、自動クリーンアップを有効にしてから 30 日後に自動削除の対象となります。
    • 自動クリーンアップをオフにしても、削除が予定されている匿名アカウントはすべて、削除予定のままになります。
    • 匿名アカウントを任意のログイン方法にリンクして「アップグレード」すれば、アカウントが自動的に削除されることはありません。

    この機能を有効にする前に、影響を受けるユーザーの数を確認するには、プロジェクトを Firebase Authentication with Identity Platform にアップグレードした場合、is_anonCloud Logging 内)でフィルタできます。

    次のステップ

    これで、ユーザーが Firebase で認証できるようになったので、Firebase ルールを使用して、Firebase データベースのデータへのユーザー アクセスを管理できます。