サーバ上のウェブのための Playゲームサービスをセットアップする



  • この記事は、Google Playゲームサービスに関する記事を和訳したものです。
  • 原文: Set Up Play Games Services for Web on the Server
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年7月ころです。

もし、強力なサーバサイドのコンポーネントを持つゲームを開発しており、ユーザを検証したり、サーバからゲームサービスの呼び出しをしたければ、以下の手順を実行します。

クライアントサイドの流れとの主な違いは、OAuth 2.0アクセストークンを直接クライアント上で使用する代わりに、クライアントがあなたのサーバに伝えるための特別な使い捨てのコードを受け取るということです。 あなたのサーバは、それからこの使い捨てのコードを、Google Playゲームサービス APIへの呼び出しをするための OAuth 2.0トークンと交換します、それはユーザの識別情報を検証するための players.get呼び出しを含んでいます。

サーバから Google Playゲームサービスと通信するゲームを構築するには:

Step 1. Google Play Consoleにてあなたのゲームをセットアップする

あなたのゲームのための Google Playゲームサービスを有効化するために Google Play Consoleを使用することを忘れないでください、Google API Consoleではありません。

  1. ゲームサービスをセットアップするに記述されたすべての手順に従って、あなたのウェブゲームのための Google Playゲームサービスを有効化します。
  2. 後のために以下の資格情報を記録します。
  3. (オプション) 実績およびリーダーボードを構成するに記述された手順に従って、あなたのゲームに実績とリーダーボードを追加します。
  4. あなたのゲームの変更を公開するに記述された手順に従って、あなたのゲームのためのテストアカウントを追加します。

Step 2. あなたのページにページレベルの構成を追加する

ページレベルの構成オプションは、あなたに、あなたのページ内の <meta>タグからサインインボタンあるいは Javascript呼び出しのパラメータを定義できるようにします。 これらのパラメータは、あなたのサインインとインタラクティブな投稿メソッドによって共有されることができ、それはあなたのコードを簡素化することができます。

Playゲームサービスを使用しているゲームのためのメタタグの典型的なセットは、次のようになります:

<meta name="google-signin-client_id" content="xxxxxxxxxxxxxx.apps.googleusercontent.com" />
<meta name="google-signin-cookiepolicy" content="single_host_origin" />
<meta name="google-signin-callback" content="signinCallback" />
<meta name="google-signin-scope" content="https://www.googleapis.com/auth/games" />

"google-signin-client_id" にあなたが指定する値は、前のステップにて記載されたあなたのゲームの OAuth 2.0 クライアント IDである必要があります。

ページレベルの構成オプションのより完全な説明については、Google Sign-In client referenceを参照してください。

Step 3. client.jsライブラリをロードする

Google APIs Client Libarary for JavaScriptをロードします。 このライブラリは、あなたがゲームサービスと通信し、ゲームサービスからレスポンスを受け取ることを容易にします。

クライアントライブラリをロードするには、次のスクリプトタグをあなたのページに追加します:

<script src="https://apis.google.com/js/client.js"></script>

これは、幾つかの便利な機能を作成するスクリプトを読み込み、後で使用することができるグローバルな gapi(Google APIの略)の中にそれらを置きます。

別の方法として、あなたはパフォーマンスを向上させるために このスクリプトを非同期に読み込むことができます。

Step 4. Googleサインインボタンを使用することを検討する

あなたのページにサインインボタンを追加する最もシンプルな方法は、HTMLベースのサインインボタンを実装することです。 実装の詳細については、Googleサインインドキュメントの Google Sign-In for server-side appsを参照してください。

多くのゲームの場合、しかしながら、あなたのゲームエンジンの上のそれ自身の <div>の内部にボタンをレンダリングすることは問題となるかもしれません。 Flashゲームでは、例えば、あなたは恐らく Flash内部でサインインボタンをレンダリングし、それから、あなたのページとともに読み込まれた JavaScriptへの externalInterface呼び出しをしたいでしょうから、あなたは Googleの JavaScriptライブラリを使用してユーザをサインインさせることができます。

このページの残りの手順では、Googleサインインボタンに頼ることなく、あなたのユーザをサインインさせ、Google Playゲームサービスへの呼び出しをする方法を示します。

Step 5. ユーザをサインインさせる

gapiクライアントは、ユーザに代わって APIを呼び出すためのライブラリを承認するために OAuth 2.0を使用します。

ひとたび gapiライブラリがロードされたならば、それはまず "サイレントに" ユーザをサインインしようと試みます。 この呼び出しは、もしユーザが過去に既にあなたのゲームを承認したことがあり、あなたが追加のスコープを追加していなければ成功します。

もしこの呼び出しが成功したならば、あなたの google-signin-callbackにて定義されたコールバックメソッドが呼び出され、認証オブジェクトがパラメータとして渡されます。 この時点で、あなたは Googleの RESTな APIに対して呼び出をするためのライブラリを使用する準備が整いました。

もしこの呼び出しが失敗したならば、コールバックメソッドが呼び出され、immediate_failedの error値を含む認証オブジェクトが渡されます。 この時点で、あなたのコールバックメソッドは、ユーザにサインインを促すボタンあるいはリンク(あるいはあなたの Flashあるいは Unityのアプリケーション内のオブジェクト)を表示する必要があります。

そのボタンあるいはリンクをクリックすると、その後、gapi.auth.signin()を呼び出す必要があります、それは、ユーザにあなたのゲームにサインインするかどうかを別ウインドウで尋ねるでしょう。 このダイアログの結果は、それからあなたの google-signin-callbackメタタグにて定義されたコールバックメソッドに渡されるでしょう。

あなたは、なぜ gapi.auth.signin()を直接呼び出す代わりにサインインのリンクを表示する手間を経る必要があるか、尋ねるかもしれません。 それは、表示されるダイアログがポップアップウインドウにて現れるからであり、もしそれがユーザのクリックに反応して発生したのでなければ、ブラウザのポップアップブロッカーによってブロックされるだろうからです。

典型的な google-signin-callbackメソッドは次のようになります:

handleAuthResult = function(auth) {
  if (auth && auth.error == null) {
    // Hooray! The user is logged int!
    // If we got here from a sign-in button, we should probably hide it
    hideMyGamesSignInButton();
    loadLeaderboardsAndAchievements();
  } else {
    // Common reasons are immediate_failed and user_signed_out
    if (auth && auth.hasOwnProperty('error')) {
      console.log('Sign in failed because: ', auth.error);
    }
    showMyGamesSignInButton();
  }
};

このコールバックメソッドは、ユーザがサイレントにサインインしたのであろうとポップアップダイアログを通したのであろうとライブラリによって呼び出されるので、このコールバックは、ユーザがサインインした方法に関係なく、Google Playゲームサービスを使用し始めるエントリの単一のポイントであることに注意してください。

Step 6. コードをサーバ上のアクセストークンと交換する

あなたの google-signin-callbackメソッドに返される認証オブジェクトは、あなたがあなたのサーバに OAuth 2.0アクセストークンと引き換えに送信するワンタイム使用コードを含んでいます。

あなたがこの手順を実現する方法はあなたが使用している言語に少し依存しますが、一般的な戦略は次のとおりです:

  1. クライアントからあなたのサーバへ、使い捨てのトークンを降らせる AJAX呼び出しをします。
  2. サーバでは、お好きな Google API client libraryを読み込みます。
  3. あなたのクライアントライブラリを初期化するとき、それに OAuth 2.0クライアント IDとクライアントシークレットを渡し、'postmessage'の redirectURIを適切な場所に指定します。
  4. OAuth 2.0 使い捨てのコードをアクセストークンと交換するためにサーバーサイド上で呼び出しをします。 これをする方法はあなたが使用しているライブラリに依存します。
  5. あなたがアクセストークンを持っているとき、あなたが取得しているユーザとして 'me' とともに Players.getへ呼び出しをします。 これによって、サーバ上で検証されたユーザの userIdを得られるでしょう。
  6. 後で使用するために、プレイヤーの userIdおよびアクセストークンをデータベースに確実に格納します。
  7. データベースにある対応する行を用いて、あなたのユーザを識別するための幾つかのシステム(セッション変数、あなた独自のランダムに生成された文字列など)を思いつきます、そして、クライアントにこの識別子を返します。

Step 7. サーバから呼び出しをする

サーバから Google Playゲームサービス APIに呼び出しをするには、この一般的な戦略に従います。 繰り返しますが、あなたがこれらの手順を実現する方法はあなたが使用している言語やライブラリに依存しますが、戦略は類似しているはずです。

  1. ウェブクライアントからサーバへ呼び出しをします。 あなたが前の手順で考案した何らかのシステムを使用してあなたのユーザを識別することを確認してください。
  2. サーバでは、あなたのデータベースからプレイヤーの認証トークンを調べます。
  3. その認証トークンを使用して、あなたのサーバサイドの APIクライアントライブラリを承認します。
  4. 呼び出しをします!
  5. これらの呼び出しの結果をブラウザに返します。

Step 8. ユーザのトークンを 45分ごとにリフレッシュする

60分ごとにあなたのアクセストークンは失効するでしょう。 上記の手順 5と 6を実行することによって、サーバ上に新しいものを作成することができます。 ひとたびユーザがサインインすれば gapi.auth.signInを呼び出すことは常に成功するので、このプロセスはユーザエクスペリエンスを中断させないでしょう。 安全のため、私たちは彼らがあなたのゲームをプレイしている間、45分ごとにユーザのトークンをリフレッシュすることをお勧めします。

Step 9. クロスサイトフォージェリ攻撃から身を守る

クロスサイトフォージェリ攻撃から身を守ることを常にお勧めします。 もし、あなたがクッキーにあらゆる種類の "remember this user later" 情報を格納するならば、これをすることは特に重要です。

これらはクロスサイトフォージェリについての詳細を学ぶための幾つかのリソースです:

これらの攻撃に対して防御するための一般的な戦略は次のとおりです:

  1. ユーザが初めてあなたのウェブページをリクエストしたとき、ランダムな文字列を生成します。
  2. この文字列を、セッションクッキーとページに埋め込まれた JavaScript変数の両方としてユーザに渡します。
  3. あなたのサーバにするすべてのリクエストについて、リクエストとともにこの Javascript変数を渡すことを確認してください。
  4. あなたがサーバ上で受け取るすべてのリクエストについて、まず、リクエストとともに渡されたランダムな文字列がセッションクッキーとして受け取った文字列と一致していることを確認してください。 もしそれらが一致しなければ、リクエストの残りを処理しません。

私たちは、初期のログインプロセス中(あなたのサーバに使い捨てのコードを渡すとき)だけでなく、あなたのサーバへの将来の呼び出し(上記の Step 7で説明したように)にもクロスサイトフォージェリの防御を追加することをお勧めします。

詳細については、Google Sign-In for server-side appsドキュメントを閲覧してください、それは、クロスサイトリクエストフォージェリに対する他の防御の例を含んでいます。

サーバおよびクライアントサイドの呼び出しをする

あなたの google-signin-callbackに渡される認証オブジェクトは、あなたのサーバに渡される使い捨てのコードだけでなく、gapiライブラリがクライアントサイドの呼び出しをするために自分自身を認証するために使用するアクセストークンも含んでいます。

これは、あなたがサーバとクライアントの両方から呼び出しをするために上記と同じプロセスを使用することができることを意味します。 例えば、サーバ上でユーザの識別情報を検証したい場合がありますが、あなたは Achievements.list呼び出しを直接することができ、それは、ネットワークの呼び出しから 1つの追加のステップを削除します。

クライアントとサーバ両方の呼び出しをするには:

  1. 上記のように手順 1~ 6を実行します。
  2. クライアント専用のドキュメントに記載されているように、gapi.client.requestを使用してクライアント上で呼び出しをします。
  3. Step 7に記述された戦略を使用してサーバ上で呼び出しをします。

Q: もし私の google-signin-callbackにて認証オブジェクトが既にアクセストークンを持っていたならば、私は、この追加のコード交換ステップを実施する代わりにサーバにそれを送信することができますか?

A: いいえ。 あなたのサーバにアクセストークンを送信することは、可能な限り避けるべきです。 "使い捨てのコードをアクセストーンと交換する" 戦略ははるかに安全で、私たちはあなたのアプリケーションにてこのアプローチを使用することを非常にお勧めします。