C++ で Firebase Authentication を使ってみる

Firebase Authentication を使用すると、ユーザーがアプリにログインする際に、メールアドレスとパスワードのログイン、Google ログインや Facebook ログインなどのフェデレーション ID プロバイダなど、複数のログイン方法を使用できるようになります。このチュートリアルでは、Firebase Authentication を使って、メールアドレスとパスワードのログインをアプリに追加する方法から始めます。

C++ プロジェクトを Firebase に接続する

Firebase Authentication を使用するには、次の作業が必要です。

  • Firebase を使用するように C++ プロジェクトを登録して構成する。

    C++ プロジェクトですでに Firebase を使用している場合、この登録と構成はすでに行われています。

  • Firebase C++ SDK を C++ プロジェクトに追加します。

Firebase を C++ プロジェクトに追加するには、Firebase コンソールと開いている C++ プロジェクトの両方でこのタスクを行う必要があります(コンソールから Firebase 構成ファイルをダウンロードして C++ プロジェクトに移動するなど)。

新しいユーザーを登録する

新規ユーザーがメールアドレスとパスワードを使用してアプリに登録できるフォームを作成します。ユーザーがフォームに入力したら、ユーザーから提供されたメールアドレスとパスワードを検証し、それらを CreateUserWithEmailAndPassword メソッドに渡します。

firebase::Future<firebase::auth::AuthResult> result =
    auth->CreateUserWithEmailAndPassword(email, password);

CreateUserWithEmailAndPasswordLastResult Future オブジェクトにコールバックを登録すると、アカウント作成オペレーションのステータスを確認できます。定期的な更新ループを使用してゲームやアプリを作成する場合は、更新ループのステータスをポーリングする方法もあります。

Future を使用した例を次に示します。

firebase::Future<firebase::auth::AuthResult> result =
    auth->CreateUserWithEmailAndPasswordLastResult();

// The lambda has the same signature as the callback function.
result.OnCompletion(
    [](const firebase::Future<firebase::auth::AuthResult>& result,
       void* user_data) {
      // `user_data` is the same as &my_program_context, below.
      // Note that we can't capture this value in the [] because std::function
      // is not supported by our minimum compiler spec (which is pre C++11).
      MyProgramContext* program_context =
          static_cast<MyProgramContext*>(user_data);

      // Process create user result...
      (void)program_context;
    },
    &my_program_context);

または、ポーリングを使用する場合は、ゲームの更新ループで次のようなコードを実行します。

firebase::Future<firebase::auth::AuthResult> result =
    auth->CreateUserWithEmailAndPasswordLastResult();
if (result.status() == firebase::kFutureStatusComplete) {
  if (result.error() == firebase::auth::kAuthErrorNone) {
    firebase::auth::AuthResult* auth_result = *result.result();
    printf("Create user succeeded for email %s\n", auth_result.user.email().c_str());
  } else {
    printf("Created user failed with error '%s'\n", result.error_message());
  }
}

既存のユーザーをログインさせる

既存のユーザーがメールアドレスとパスワードを使用してログインできるフォームを作成します。ユーザーがフォームに入力したら、SignInWithEmailAndPassword メソッドを呼び出します。

firebase::Future<firebase::auth::AuthResult> result =
    auth->SignInWithEmailAndPassword(email, password);

登録の結果を取得したのと同じ方法でログイン操作の結果を取得します。

認証状態リスナーを設定し、アカウント データを取得する

ログイン イベントとログアウト イベントに応答するには、グローバル認証オブジェクトにリスナーをアタッチします。このリスナーは、ユーザーのログイン状態が変わるたびに呼び出されます。リスナーは、認証オブジェクトが完全に初期化され、ネットワーク呼び出しが完了した後にのみ実行されるため、ログインしたユーザーに関する情報を取得するのに最適です。

firebase::auth::AuthStateListener 抽象クラスを実装してリスナーを作成します。たとえば、ユーザーがログインに成功したときにユーザーに関する情報を取得するリスナーを作成するには、次のようにします。

class MyAuthStateListener : public firebase::auth::AuthStateListener {
 public:
  void OnAuthStateChanged(firebase::auth::Auth* auth) override {
    firebase::auth::User user = auth.current_user();
    if (user.is_valid()) {
      // User is signed in
      printf("OnAuthStateChanged: signed_in %s\n", user.uid().c_str());
      const std::string displayName = user.DisplayName();
      const std::string emailAddress = user.Email();
      const std::string photoUrl = user.PhotoUrl();
    } else {
      // User is signed out
      printf("OnAuthStateChanged: signed_out\n");
    }
    // ...
  }
};

リスナーを firebase::auth::Auth オブジェクトの AddAuthStateListener メソッドでアタッチします。

MyAuthStateListener state_change_listener;
auth->AddAuthStateListener(&state_change_listener);

次のステップ

他の ID プロバイダと匿名ゲスト アカウントのサポートを追加する方法を学びます。