Serverseitiger Zugriff auf die Google Play-Spieldienste

Wir empfehlen, Spieler zu authentifizieren und die Identität des Spielers sicher an den Back-End-Server zu übergeben. Dadurch kann Ihr Spiel die Identität und andere Daten des Spielers sicher abrufen, ohne einer Manipulation ausgesetzt zu sein, während es durch das Gerät gelangt.

In diesem Szenario können Sie nach erfolgreicher Anmeldung des Spielers einen speziellen Code zur einmaligen Verwendung (den sogenannten Server-Authentifizierungscode) vom Play Games Services v2 SDK anfordern, den der Client an den Server übergibt. Tauschen Sie dann auf dem Server den Server-Authentifizierungscode gegen ein OAuth 2.0-Token aus, mit dem der Server Aufrufe an die Google Play Game Services API senden kann.

Weitere Informationen zum Hinzufügen der Anmeldung in deinen Spielen findest du unter Anmeldung für Android-Spiele.

Für den Offlinezugriff sind folgende Schritte erforderlich:

  1. In der Google Play Console: Erstellen Sie Anmeldedaten für Ihren Gameserver. Der OAuth-Clienttyp der Anmeldedaten ist „web“.
  2. In der Android-App: Fordern Sie bei der Anmeldung einen Server-Authentifizierungscode für die Anmeldedaten Ihres Servers an und geben Sie diesen an Ihren Server weiter.
  3. Auf Ihrem Spieleserver: Tauschen Sie den Server-Authentifizierungscode mithilfe der Google-Authentifizierungsdienste gegen ein OAuth-Zugriffstoken aus und rufen Sie damit die REST APIs der Play-Spieldienste auf.

Vorbereitung

Du musst dein Spiel zuerst in der Google Play Console hinzufügen, wie unter Google Play-Spieldienste einrichten beschrieben, und die Anmeldung über die Play-Spieldienste in dein Spiel integrieren.

Serverseitige Webanwendung erstellen

Die Google Play-Spieldienste bieten keinen Backend-Support für Webspiele. Sie bietet jedoch Backend-Server-Unterstützung für den Server Ihres Android-Spiels.

Wenn du die REST APIs für die Google Play-Spieldienste in deiner serverseitigen App verwenden möchtest, gehe so vor:

  1. Gehen Sie in der Google Play Console in Ihrem Spiel zu Play-Spieldienste > Einrichtung und Verwaltung > Konfiguration.
  2. Wählen Sie Anmeldedaten hinzufügen aus, um die Seite Anmeldedaten hinzufügen aufzurufen. Wählen Sie als Anmeldedatentyp Spieleserver aus und fahren Sie mit dem Abschnitt Autorisierung fort.
    1. Wenn Ihr Spieleserver bereits eine OAuth-Client-ID hat, wählen Sie diese aus dem Drop-down-Menü aus. Nachdem Sie die Änderungen gespeichert haben, fahren Sie mit dem nächsten Abschnitt fort.
    2. Wenn du noch keine OAuth-Client-ID für deinen Gameserver hast, kannst du eine erstellen.
      1. Klicken Sie auf OAuth-Client erstellen und folgen Sie dem Link OAuth-Client-ID erstellen.
      2. Dadurch gelangen Sie zur Google Cloud Platform-Seite OAuth-Client-ID erstellen für das mit Ihrem Spiel verknüpfte Cloud Platform-Projekt.
      3. Füllen Sie das Formular der Seite aus und klicken Sie auf „Erstellen“. Legen Sie den Anwendungstyp auf „Webanwendung“ fest.
      4. Kehren Sie zum Bereich Add credential page's Authorization zurück, wählen Sie den neu erstellten OAuth-Client aus und speichern Sie die Änderungen.

Server-Authentifizierungscode abrufen

So rufen Sie einen Server-Authentifizierungscode ab, den Ihr Spiel für Zugriffstokens auf Ihrem Backend-Server verwenden kann:

  1. Rufen Sie requestServerSideAccess über den Client auf.

    1. Achten Sie darauf, die OAuth-Client-ID zu verwenden, die für Ihren Gameserver registriert ist, und nicht die OAuth-Client-ID Ihrer Android-App.
    2. Optional: Wenn Ihr Gameserver Offlinezugriff (langlebiger Zugriff mithilfe eines Aktualisierungstokens) auf die Play-Spieldienste benötigt, können Sie den Parameter „forceRefreshToken“ auf „true“ setzen.
    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
    gamesSignInClient
      .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= */ false)
      .addOnCompleteListener( task -> {
        if (task.isSuccessful()) {
          String serverAuthToken = task.getResult();
          // Send authentication code to the backend game server to be
          // exchanged for an access token and used to verify the player
          // via the Play Games Services REST APIs.
        } else {
          // Failed to retrieve authentication code.
        }
    });
    
  2. Sende das OAuth-Authentifizierungscode-Token an deinen Backend-Server, damit es ausgetauscht, die Spieler-ID mit den Play-Spieldienste-REST-APIs überprüft und anschließend für dein Spiel authentifiziert werden kann.

Server-Authentifizierungscode senden

Senden Sie den Server-Authentifizierungscode an Ihren Backend-Server, um Zugriffs- und Aktualisierungstokens auszutauschen. Verwenden Sie das Zugriffstoken, um die Play Games Services API im Namen des Spielers aufzurufen und optional das Aktualisierungstoken zu speichern, um nach Ablauf des Zugriffstokens ein neues Zugriffstoken zu erhalten.

Das folgende Code-Snippet zeigt, wie Sie den serverseitigen Code in der Programmiersprache Java implementieren können, um den Server-Authentifizierungscode gegen Zugriffstokens auszutauschen. Dabei wird die Beispiel-App „clientserverskeleton“ verwendet.

/**
 * 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;
}

REST APIs vom Server aufrufen

Eine vollständige Beschreibung der verfügbaren API-Aufrufe finden Sie unter REST APIs für Google Play-Spieldienste.

Hier einige Beispiele für REST API-Aufrufe:

Spieler

Möchten Sie die ID und Profildaten des angemeldeten Spielers abrufen? Rufen Sie [Players.get][] mit 'me' als ID auf.

Friends

Weitere Informationen findest du im Leitfaden für Freunde.

Erfolge

Weitere Informationen

  • Rufen Sie AchievementDefinitions.list auf, um eine Liste der aktuellen Erfolge abzurufen.

  • Kombinieren Sie dies mit einem Aufruf von Achievements.list, um herauszufinden, welche der Spieler freigeschaltet hat.

  • Rufen Sie Achievements.unlock auf, um einen Spielererfolg freizuschalten.

  • Rufen Sie Achievements.increment auf, um den Fortschritt eines Erfolgs zu melden und herauszufinden, ob der Spieler ihn freigeschaltet hat.

  • Wenn Sie Fehler für ein Spiel beheben, das noch nicht in der Produktion ist, können Sie Achievements.reset oder Achievements.resetAll über die Management APIs aufrufen, um Erfolge auf ihren ursprünglichen Zustand zurückzusetzen.

Bestenlisten

Weitere Informationen finden Sie im Leitfaden zu Bestenlisten.

  • Möchtest du eine Liste mit allen Ergebnistafeln im Spiel erhalten? Rufen Sie Leaderboards.list auf.

  • Wenn ein Spieler ein Spiel beendet hat, können Sie seine Punktzahl an Scores.submit senden, um herauszufinden, ob es sich um einen neuen Highscore handelt.

  • Rufen Sie zum Anzeigen einer Bestenliste die Daten aus Scores.list ab und zeigen Sie sie dem Nutzer.

  • Verwenden Sie Scores.listWindow, um eine Auswahl von Punktzahlen zu finden, die nahe an der Highscore des Nutzers liegt.

  • Wenn Sie weitere Informationen zur Punktzahl eines Spielers in einer bestimmten Bestenliste erhalten möchten (wenn der Spieler beispielsweise zu den besten 12% aller Spieler gehört), rufen Sie Scores.get auf.

  • Wenn Sie Fehler in einem Spiel beheben, können Sie Scores.reset über die Management APIs aufrufen, um alle Punktzahlen für diesen Spieler aus einer bestimmten Bestenliste zurückzusetzen.