Android で Google Play ゲームサービスを使用して認証する

Google Play ゲームサービスを使用して、Firebase で構築した Android ゲームにプレーヤーをログインさせることができます。Firebase で Google Play ゲームサービスのログインを使用するには、まず Google Play ゲームでプレーヤーをログインさせ、OAuth 2.0 の認証コードをリクエストします。次に、認証コードを PlayGamesAuthProvider に渡して Firebase 認証情報を生成します。この認証情報を Firebaseでの認証に使用できます。

準備

Android Studio プロジェクトを設定する

  1. Firebase を Android プロジェクトに追加します
  2. Firebase Authentication と Google Play 開発者サービスの依存関係をアプリレベルの build.gradle ファイルに追加します。
    implementation 'com.google.firebase:firebase-auth:16.0.2'
    implementation 'com.google.android.gms:play-services-auth:15.0.1'
    

Firebase プロジェクトを設定する

  1. ゲームの SHA-1 フィンガープリントを、Firebase コンソールの [設定] ページで設定します。

    次のように keytool コマンドを使用して、キーの SHA-1 フィンガープリントを取得できます。

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

  2. 次のように Google Play ゲームをログイン プロバイダとして有効にします。

    1. プロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを見つけます。ウェブサーバーのクライアント ID は、Google Play の認証サーバーでの Firebase プロジェクトの識別に使用されます。

      これらの値は次の手順で確認できます。

      1. Google API Console の認証情報ページで Firebase プロジェクトを開きます。
      2. [OAuth 2.0 クライアント ID] セクションで、ウェブ クライアント(Google サービスで自動作成)の詳細ページを開きます。このページに、ウェブサーバーのクライアント ID とクライアント シークレットが記載されています。
    2. 次に、Firebase コンソールで [Authentication] セクションを開きます。

    3. [ログイン方法] タブで、[Play ゲーム] ログイン プロバイダを有効にします。API Console で取得した、プロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを指定する必要があります。

  1. Google Play Console を開き、[ゲーム サービス] をクリックします。
  2. [新しいゲームを追加] をクリックします。新しいゲームのダイアログで、[ゲームで Google API を既に使用しています] をクリックし、リスト内の Firebase プロジェクトの名前をクリックします。ゲームカテゴリを選択し、[次へ] をクリックして、[ゲームの詳細] ページに移動します。
  3. [ゲームの詳細] ページの最後で、必要な API がすべて有効になっていることを確認します。
  4. 次に、[リンク済みアプリ] ページを開き、[Android] をクリックします。ゲームのパッケージ名を指定し、[保存して次へ] をクリックします。コンソールに Android クライアント ID が表示されます。この値は無視してかまいません。
  5. [テスト] ページで、Play ストアにゲームをリリースする前に、ゲームにログインできるようにするユーザーのメールアドレスをホワイトリストに登録します。

Play ゲームのログインをゲームに統合する

まず、Play ゲームのログインをアプリに統合します。詳しい手順については、Android ゲームへのログインについての記事をご覧ください。

統合時に GoogleSignInOptions オブジェクトを構築する場合は、DEFAULT_GAMES_SIGN_IN 設定を使用して requestServerAuthCode を呼び出します。

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
    .requestServerAuthCode(getString(R.string.default_web_client_id))
    .build();

ウェブサーバーのクライアント ID を requestServerAuthCode メソッドに渡す必要があります。これは、Firebase コンソールで Play ゲームのログインを有効にしたときに指定した ID です。

Firebase で認証する

Play ゲームのログインをアプリに追加したら、プレーヤーが Play ゲームへのログインに成功したときに取得する Google アカウントの認証情報を、Firebase で使用するように設定する必要があります。

  1. まず、ログイン アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。

    private FirebaseAuth mAuth;
    // ...
    mAuth = FirebaseAuth.getInstance();
    
  2. アクティビティを初期化するときに、プレーヤーが Firebase でログイン済みであるかどうかを確認します。

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }

    ログインしていない場合は、ログインするオプションを含め、ゲームのログアウトについてプレーヤーに提示します。

  3. プレーヤーが Play ゲームにサイレント ログインまたはインタラクティブ ログインしたら、GoogleSignInAccount オブジェクトから認証コードを取得して、Firebase 認証情報と交換し、Firebase 認証情報を使用して Firebase で認証します。

    // Call this both in the silent sign-in task's OnCompleteListener and in the
    // Activity's onActivityResult handler.
    private void firebaseAuthWithPlayGames(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.getId());
    
        AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
                            Toast.makeText(GoogleSignInActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }
    
                        // ...
                    }
                });
    }
    

    signInWithCredential の呼び出しが成功した場合は、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

次のステップ

ユーザーが初めてログインすると新しいユーザー アカウントが作成され、ユーザーの Play ゲーム ID にリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、プロジェクト内のすべてのアプリでユーザーを特定するために使用できます。

ゲームでは、FirebaseUser オブジェクトからユーザーの Firebase UID を取得できます。

FirebaseUser user = mAuth.getCurrentUser();
String playerName = user.getDisplayName();

// The user's Id, unique to the Firebase project.
// Do NOT use this value to authenticate with your backend server, if you
// have one; use FirebaseUser.getIdToken() instead.
String uid = user.getUid();

Firebase Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth 変数から取得し、それを使用してどのデータをユーザーからアクセス可能にするかを制御できます。

ユーザーの Play ゲームのプレーヤー情報を取得したり、Play ゲームサービスにアクセスしたりするには、Google Play ゲームサービス SDK で提供されている API を使用します。

ユーザーをログアウトするには、FirebaseAuth.signOut() を呼び出します。

FirebaseAuth.getInstance().signOut();

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

ご不明な点がありましたら、Google のサポートページをご覧ください。