Google Play Games サービスへのサーバーサイド アクセスを有効にする

ゲームでバックエンド サーバーを使用する場合は、 Google ログインでプレーヤーを認証し、 プレーヤーの ID をバックエンド サーバーに安全に渡せます。これにより プレーヤーの ID などのデータをゲームから安全に取得します。その際、 デバイスを通過する間に改ざんされる可能性がある。

このシナリオでは、通常どおり、Google Play Games サービスにログインするようプレーヤーに求めます。リリースを プレーヤーがログインに成功すると、GoogleSignInAccount オブジェクトには 1 回限りの特別なコードが含まれます。 (サーバー認証コードと呼ばれます)。クライアントがサーバーに渡します。次に、サーバー上で サーバーが OAuth 2.0 トークンのサーバー認証コードを使用して、このトークンを使用して Google Play Games Services API。

ゲームにログイン機能を追加する方法について詳しくは、 Android ゲームにログインします

Google ログインを使用してプレーヤーを認証する方法を示す詳細なコードサンプルについては、 GitHub の clientserverskeleton サンプル

オフライン アクセスに必要な手順は次のとおりです。

  1. Google Play Console の場合: ゲームサーバーの認証情報を作成します。「 認証情報の OAuth クライアント タイプは「web」です。
  2. Android アプリで: ログインの一環として、サーバーの認証情報についてサーバー認証コードをリクエストし、サーバーに渡します。
  3. ゲームサーバー上で: サーバー認証コードを交換して OAuth アクセスを実現する Google 認証サービスを使用してトークンを作成し、そのトークンを使用して Play Games サービスの REST API

始める前に

Google ログインをゲームに統合する前に、まずゲームを Google Play ConsoleGoogle Play Games サービスのセットアップ

ゲームに関連するサーバーサイド ウェブ アプリケーションを作成する

Google Play Games サービスは、ウェブゲームのバックエンド サポートを提供しません。ただし、Android ゲームのサーバーのバックエンド サポートは提供します。

Google Play Games サービスの REST API をサーバーサイド アプリで使用する場合は、次の手順を行います。

  1. ゲームに関連付けられたウェブアプリを、下の [リンクされたアプリ] セクションで Google Play Console。注: launch_url はこのフローでは使用されず、空白のままで構いません。
  2. アプリの認証情報を取得する手順は次のとおりです。 <ph type="x-smartling-placeholder">
      </ph>
    1. Google Play Console でゲームの [ゲームの詳細] をクリックします。
    2. [API Console Project] セクションまで下方向にスクロールし、リンクをクリックします。 API Console プロジェクトに公開します
    3. [API とサービス >Google API の [Credentials] 画面 コンソールで、ウェブアプリの client_secret.json ファイルをダウンロードします サーバーがアクセスできる場所に保存します。クライアントを記録する 後で参照するための認証情報の ID。
  3. サーバーサイド アプリを再起動して、 クライアントアプリで使用できます。

クライアントでログインを実行する

GoogleSignInClient クラスは、現在のアカウントのアカウントを取得するためのメインのエントリ ポイントです。 ログインする必要があります。また、アプリでログインしたことがない場合は、 ダウンロードします

ログイン クライアントを作成する手順は次のとおりです。

  1. GoogleSignInOptions オブジェクトを使用してログイン クライアントを作成します。 GoogleSignInOptions.Builder でログインを設定するには、次の情報を指定する必要があります。 GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
  2. また、ゲームに認証が必要であることも指定する必要があります バックエンド サーバーのコードを GoogleSignInOptions.Builder.requestServerAuthCode() メソッド(サーバーのクライアント ID を パラメータを指定します。後ほど説明のとおり、バックエンド サーバー上のアクセス トークンの認証コードを取得します。 サーバー認証コードを取得するをご覧ください。
  3. GoogleSignIn.getClient() メソッドを呼び出し、前に構成したオプションを渡します。もし 成功すると、Google Sign-In API は GoogleSignInClient のインスタンスを返します。
  4. GoogleSignInClient インスタンスを取得したら、プレーヤーのログインに進む必要があります。 アクティビティの onResume() から通知なく呼び出す( サイレント ログインの実行

次の例をご覧ください。

private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;

private void startSignInForAuthCode() {

  // Client ID for your backend server.
  String webClientId = getString(R.string.webclient_id);

  GoogleSignInOptions signInOption = new
      GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
      .requestServerAuthCode(webClientId)
      .build();

  GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOption);
  Intent intent = signInClient.getSignInIntent();
  startActivityForResult(intent, RC_SIGN_IN);
}

サーバー認証コードを取得する

ゲームがバックエンド サーバーのアクセス トークンに使用できるサーバー認証コードを取得するには、次の手順を実施します。 getServerAuthCode()を呼び出す GoogleSignInAccount のメソッド プレーヤーのログイン成功時に Google ログインが返すオブジェクト。

次の例をご覧ください。


// Auth code to send to backend server.
private String mServerAuthCode;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == RC_SIGN_IN) {
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    if (result.isSuccess()) {
      mServerAuthCode = result.getSignInAccount().getServerAuthCode();
    } else {
      String message = result.getStatus().getStatusMessage();
      if (message == null || message.isEmpty()) {
        message = getString(R.string.signin_other_error);
      }
      new AlertDialog.Builder(this).setMessage(message)
          .setNeutralButton(android.R.string.ok, null).show();
    }
  }
}

サーバー認証コードをサーバーのアクセス トークンと交換する

サーバー認証コードをバックエンド サーバーに送信して、アクセス トークンと更新トークンと交換します。 アクセス トークンを使用して、プレーヤーの代わりに Google Play Games サービス API を呼び出します。必要に応じて、 更新トークンを保存して、アクセス トークンの有効期限が切れたときに新しいアクセス トークンを取得します。

次のコード スニペットは、Java プログラミング言語を使用してサーバー認証コードをアクセス トークンと交換します。内容 使用 clientserverskeleton サンプルアプリ:

/**
 * Exchanges the authcode for an access token credential.  The credential
 * is the associated with the given player.
 *
 * @param authCode - the non-null authcode passed from the client.
 * @param player   - the player object which the given authcode is
 *                 associated with.
 * @return the HTTP response code indicating the outcome of the exchange.
 */
private int exchangeAuthCode(String authCode, Player player) {
try {

    // The client_secret.json file is downloaded from the Google API
    // console.  This is used to identify your web application.  The
    // contents of this file should not be shared.
    //
    File secretFile = new File("client_secret.json");

    // If we don't have the file, we can't access any APIs, so return
    // an error.
    if (!secretFile.exists()) {
        log("Secret file : " + secretFile
                .getAbsolutePath() + "  does not exist!");
        return HttpServletResponse.SC_FORBIDDEN;
    }

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
            JacksonFactory.getDefaultInstance(), new
            FileReader(secretFile));

    // Extract the application id of the game from the client id.
    String applicationId = extractApplicationId(clientSecrets
            .getDetails().getClientId());

    GoogleTokenResponse tokenResponse =
            new GoogleAuthorizationCodeTokenRequest(
            HTTPTransport,
            JacksonFactory.getDefaultInstance(),
            "https://oauth2.googleapis.com/token",
            clientSecrets.getDetails().getClientId(),
            clientSecrets.getDetails().getClientSecret(),
            authCode,
            "")
            .execute();

    log("hasRefresh == " + (tokenResponse.getRefreshToken() != null));
    log("Exchanging authCode: " + authCode + " for token");
    Credential credential = new Credential
            .Builder(BearerToken.authorizationHeaderAccessMethod())
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setTransport(HTTPTransport)
            .setTokenServerEncodedUrl("https://www.googleapis.com/oauth2/v4/token")
            .setClientAuthentication(new HttpExecuteInterceptor() {
                @Override
                public void intercept(HttpRequest request)
                        throws IOException {
                        }
            })
            .build()
            .setFromTokenResponse(tokenResponse);

    player.setCredential(credential);

    // Now that we have a credential, we can access the Games API.
    PlayGamesAPI api = new PlayGamesAPI(player, applicationId,
            HTTPTransport, JacksonFactory.getDefaultInstance());

    // Call the verify method, which checks that the access token has
    // access to the Games API, and that the player id used by the
    // client matches the playerId associated with the accessToken.
    boolean ok = api.verifyPlayer();

    // Call a Games API on the server.
    if (ok) {
        ok = api.updatePlayerInfo();
        if (ok) {
            // persist the player.
            savePlayer(api.getPlayer());
        }
    }

    return ok ? HttpServletResponse.SC_OK :
            HttpServletResponse.SC_INTERNAL_SERVER_ERROR;

  } catch (IOException e) {
    e.printStackTrace();
  }
  return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}

ログインしたプレーヤーに代わってバックエンド サーバーから Google API にアクセスする方法について詳しくは、 サーバーサイド アクセスの有効化をご覧ください。

プレーヤーのログアウトを処理する

プレーヤーをゲームからログアウトするには、GoogleSignInClientsignOut() メソッドを呼び出します。たとえば、 サンプル コード スニペットについては、以下をご覧ください。 プレーヤーのログアウト

サーバーから REST API を呼び出す

詳しくは、Google Play Games サービスの REST API をご覧ください。 をご覧ください。

REST API 呼び出しのうち、有用だと思われるものの例を次に示します。

プレーヤー

  • ログインしているプレーヤーの ID とプロフィール データを取得する場合は、Players.get を呼び出します。 ID は 'me' です。

友だち

友達について詳しくは、友達ガイドをご覧ください。

  • プレーヤーの友だちリストを取得しますか?次のコマンドで Players.list を呼び出します。 collection として 'friends_all'
  • 友達リストにアクセスできるかどうかを確認します。me について Players.get を呼び出し、 レスポンスの profileSettings.friendsListVisibility フィールドを確認します。

実績

実績についての説明が記載された実績ガイドをご覧ください。 詳しく説明します。

  • 現在の実績のリストを取得しますか?AchievementDefinitions.list を呼び出すことができます。
  • これと Achievements.list の呼び出しを組み合わせて、プレーヤーがロック解除した実績を確認します。
  • 実績を獲得しましたか?Achievements.unlock を使用してロックを解除してください。
  • 部分的な達成に向けて前進しましたか?Achievements.increment を使用する 進行状況を報告し、プレーヤーがロック解除したかどうかを確認します。
  • まだ本番環境にないゲームをデバッグしていますか?発信してみてください Management API の Achievements.reset または Achievements.resetAll 実績を元の状態にリセットできます。

リーダーボード

リーダーボードについて詳しくは、リーダーボードに関するガイドをご覧ください。

  • ゲームの全スコアボードのリストを取得する場合は、Leaderboards.list を呼び出します。
  • プレーヤーのゲーム終了そのスコアを Scores.submit に送信し、 ハイスコアを更新しています
  • リーダーボードを表示しますか?Scores.list からデータを取得し、ユーザーに表示します。
  • Scores.listWindow を使用して、ユーザーのハイスコアに近い一連のスコアを見つけます。
  • 特定のリーダーボードでのプレーヤーのスコアに関する詳細情報( がすべてのプレーヤーの上位 12% に入っている場合、Scores.get を呼び出します。
  • ゲームをデバッグしていますか?管理チームから Scores.reset を呼び出して 特定のリーダーボードからそのプレーヤーのすべてのスコアをリセットする API