コンソールへ移動

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.1.0'
    implementation 'com.google.android.gms:play-services-auth:16.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 を呼び出します。

Java
Android

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

Kotlin
Android

val gso = 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 オブジェクトの共有インスタンスを取得します。

Java
Android

private FirebaseAuth mAuth;// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();

Kotlin
Android

private lateinit var auth: FirebaseAuth// ...
// Initialize Firebase Auth
auth = FirebaseAuth.getInstance()
  1. アクティビティを初期化するときに、プレーヤーがすでに Firebase でログインしているかどうかを確認します。

Java
Android

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

Kotlin
Android

public override fun onStart() {
    super.onStart()
    // Check if user is signed in (non-null) and update UI accordingly.
    val currentUser = auth.currentUser
    updateUI(currentUser)
}
If the player isn't signed in, present the player with your game's
signed-out experience, including the option to sign in.
  1. プレーヤーが Play ゲームにサイレント ログインまたはインタラクティブ ログインしたら、GoogleSignInAccount オブジェクトから認証コードを取得して、Firebase 認証情報と交換し、Firebase 認証情報を使用して Firebase で認証します。

Java
Android

// 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());

    final FirebaseAuth auth = FirebaseAuth.getInstance();
    AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
    auth.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 = auth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }

                    // ...
                }
            });
}

Kotlin
Android

// Call this both in the silent sign-in task's OnCompleteListener and in the
// Activity's onActivityResult handler.
private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
    Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)

    val auth = FirebaseAuth.getInstance()
    val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }

                // ...
            }
}

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

次のステップ

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

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

Java
Android

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();

Kotlin
Android

val user = auth.currentUser
user?.let {
    val playerName = user.displayName

    // 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.
    val uid = user.uid
}

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

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

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

Java
Android

FirebaseAuth.getInstance().signOut();

Kotlin
Android

FirebaseAuth.getInstance().signOut()