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

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

準備

Unity を設定する

  1. Unity プロジェクトに Firebase を追加するガイドの Android 用の設定セクションにある説明に沿って、Firebase と Unity SDK を Unity プロジェクトに追加します。

    FirebaseAuth.unitypackage をインポートします。

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

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

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

  1. Unity で設定したパッケージ名を使用して、Firebase コンソールからゲームを Firebase プロジェクトに追加します。

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

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

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE
    開発中も含め、このキーを使用して APK に署名する必要があります。

  3. 次のように 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. もう一度 [リンク済みアプリ] ページを開き、[別のアプリをリンク] > [ウェブ] をクリックします。このページを使用して、Firebase Auth が Google Play から認証トークンを取得できるようにします。

    [起動 URL] フィールドでは、firebaseapp.com ドメインを使用している https://myfirebaseproject-1ac49.firebaseapp.com/ など、独自に制御する任意の URL を指定します。この URL は実際に有効である必要はありませんが、localhost 以外の値を指定する必要があります。

    次に、次のページで [アプリを表示して選択] をクリックし、ウェブサーバーのクライアント ID を選択します。ウェブサーバーのクライアント ID には、https://myfirebaseproject-1ac49.firebaseapp.com/__/auth/handler のようなリダイレクト URI が含まれます。

  6. [イベント]、[実績]、[リーダーボード] のページで、ゲームで使用したい Play ゲーム リソースを作成します(すぐに使用したいリソースがない場合は、プレースホルダ エントリを作成できます)。次に、[イベント]、[実績]、[リーダーボード] のいずれかのページで、[リソースを取得] をクリックし、Android リソース スニペットを任意の場所にコピーします。スニペットは、Google Play ゲームサービス プラグインを設定するために必要です。

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

    <?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 ストアにゲームをリリースする前に、ゲームにログインできるようにするユーザーのメールアドレスをホワイトリストに登録します。

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

  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.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

次のステップ

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

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

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null) {
  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();

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

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