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

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

始める前に

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

  1. Unity プロジェクトに Firebase を追加するの説明に従って、Firebase 構成ファイルと Firebase Unity SDK を Unity プロジェクトに追加します。Android 用の手順に従ってください。

    必ず、FirebaseAuth.unitypackage をインポートしてください。

  2. Unity エディタの [Build Settings] > [Player Settings] > [Other Settings] で、ゲームの Android パッケージ名を設定します。

  3. 次に、[Build Settings] > [Player Settings] > [Publishing Settings] で、Android パッケージへの署名に使用するキーストアとキーを選択するか作成します。Play ゲームのログインが正常に動作するためには、APK に署名する必要があります。APK への署名は、ゲームの公開時だけでなく、ゲームの開発時にも必要です。

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

  1. Firebase コンソールで、Unity プロジェクトを登録した Firebase プロジェクトに移動します。

  2. Unity で設定したキーを使用して、Firebase コンソールの [設定] ページからゲームの SHA-1 フィンガープリントを設定します。

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

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

    別の方法としては、gradle signingReport コマンドを使用して、署名証明書の SHA ハッシュを取得できます。

    gradlew signingReport

    開発中も含め、このキーを使用して APK に署名する必要があります。

  3. Google Play Games をログイン プロバイダとして有効にします。

    1. Firebase コンソールで、[Authentication] セクションを開きます。

    2. プロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを生成して取得します。

      1. [Sign-in method] タブで、[Google] ログイン プロバイダを有効にします。

      2. ウェブサーバーのクライアント ID とシークレットを Google ログイン プロバイダからコピーします。

    3. [Sign-in method] タブで [Play Games] ログイン プロバイダを有効にし、前のステップで取得したプロジェクトのウェブサーバーのクライアント ID とクライアント シークレットを指定します。

Firebase アプリの情報を使用して Play Games services を構成する

  1. Google Play Console で、Google Play アプリを開くか、アプリを作成します。

  2. [Grow] セクションで、Play Games services > [設定と管理] > [設定] をクリックします。

  3. [はい、ゲームで Google API をすでに使用しています] をクリックし、リストから Firebase プロジェクトを選択して [使用する] をクリックします。

  4. Play Games services の設定ページで、[認証情報を追加] をクリックします。

    1. [ゲームサーバー] のタイプを選択します。
    2. [OAuth クライアント] フィールドで、プロジェクトのウェブ クライアント ID を選択します。Play Games ログインを有効にしたときに指定したクライアント ID と同じ ID を選択してください。
    3. 変更を保存します。
  5. 引き続き Play Games services の設定ページで、もう一度 [認証情報を追加] をクリックします。

    1. [Android] のタイプを選択します。
    2. [OAuth クライアント] フィールドで、プロジェクトの Android クライアント ID を選択します(目的の Android クライアント ID が表示されない場合は、Firebase コンソールでゲームの SHA-1 フィンガープリントが設定されていることを確認してください)。
    3. 変更を保存します。
  6. [イベント]、[実績]、[リーダーボード] のページで、ゲームで使用したい Play Games リソースを作成します(すぐに使用したいリソースがない場合は、プレースホルダ エントリを作成できます)。次に、[イベント]、[実績]、[リーダーボード] のいずれかのページで、[リソースを取得] をクリックし、Android リソース スニペットを任意の場所にコピーします。スニペットは、Google Play Games services プラグインを設定するために必要です。

    リソース スニペットは、次の例のようになります。

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    Google Play game services IDs.
    Save this file as res/values/games-ids.xml in your project.
    -->
    <resources>
      <!-- app_id -->
      <string name="app_id" translatable="false">123456789000</string>
      <!-- package_name -->
      <string name="package_name" translatable="false">com.example.game</string>
      <!-- event Wiped Raid -->
      <string name="event_wiped_raid" translatable="false">CgkIpKjv1a4PEAIYBA</string>
    </resources>
    
  7. [テスター] ページで、Play Store にゲームをリリースする前に、ゲームにログインできるようにするユーザーのメールアドレスを追加します。

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

  1. Unity 用の Play ゲーム プラグインの最新リリースをダウンロードして解凍します。

  2. プラグインの Unity パッケージを Unity プロジェクトにインポートします。Unity パッケージは、リリース アーカイブの current-build ディレクトリにあります。

  3. 次のようにして、Play ゲーム プラグインを設定します。

    1. [Window] > [Google Play Games] > [Setup] > [Android Setup] をクリックして、[Android Configuration] 画面を開きます。
    2. Play Console から取得した Android リソース スニペットを [Resources Definition] フィールドに貼り付けます。
    3. ウェブサーバーのクライアント ID、つまり Firebase コンソールで Play ゲームのログインを有効にしたときに指定した ID を [Client ID] フィールドに貼り付けます。
    4. [Setup] をクリックします。
  4. ゲームのコード内で RequestServerAuthCode 設定を有効にして Play ゲーム クライアントを構成します。

    using GooglePlayGames;
    using GooglePlayGames.BasicApi;
    using UnityEngine.SocialPlatforms;
    using System.Threading.Tasks;
    
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        .RequestServerAuthCode(false /* Don't force refresh */)
        .Build();
    
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    
  5. 次に、プレーヤーが Play ゲームでログインするよう選択したときに、Social.localUser.Authenticate() を呼び出します。

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

Firebase で認証する

Play ゲームのログインをゲームに追加したら、Play ゲームサービスの認証コードを使用して Firebase で認証します。

  1. プレーヤーが Play ゲームを使用して正常にログインした後、ログイン継続ハンドラでプレーヤーのアカウントの認証コードを取得します。

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. その後、Play ゲームサービスの認証コードを Firebase 認証情報と交換し、Firebase 認証情報を使用してプレーヤーを認証します。

    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    Firebase.Auth.Credential credential =
        Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

次のステップ

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

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

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null && user.IsValid()) {
  string 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 User.TokenAsync() instead.
  string uid = user.UserId;
}

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

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

ユーザーのログアウトを行うには、SignOut() を呼び出します。

auth.SignOut();