Włączanie dostępu po stronie serwera do usług gier Google Play

Zalecamy uwierzytelnianie graczy i bezpieczne przekazywanie ich tożsamości na serwer backendu. Dzięki temu gra może bezpiecznie pobierać tożsamość gracza i inne dane bez ujawniania potencjalnej ingerencji w urządzenie.

W takim przypadku, gdy użytkownik się zaloguje, możesz poprosić o specjalny kod jednorazowy (nazywany kodem autoryzacji serwera) z pakietu SDK usług gier Play w wersji 2, który klient przekazuje na serwer. Następnie na serwerze wymień kod uwierzytelniania serwera na token OAuth 2.0, którego serwer może używać do wywoływania interfejsu API usług gier Google Play.

Dodatkowe informacje o dodawaniu logowania w grach znajdziesz w artykule Logowanie się w grach na Androida.

Aby uzyskać dostęp offline, musisz wykonać te czynności:

  1. W Konsoli Google Play: utwórz dane logowania na serwer gry. Typ danych uwierzytelniających klienta OAuth to „web”.
  2. W aplikacji na Androida: podczas logowania poproś o kod autoryzacji serwera i prześlij go na swój serwer.
  3. Na serwerze gry: zmień kod uwierzytelniania serwera w przypadku tokena OAuth za pomocą usług uwierzytelniania Google, a następnie użyj go do wywołania interfejsów API REST usług gier Play.

Zanim zaczniesz

Najpierw musisz dodać grę w Konsoli Google Play zgodnie z opisem w artykule Konfigurowanie usług gier Google Play i zintegrować z nią logowanie usług gier Play.

Utwórz powiązaną aplikację internetową po stronie serwera dla swojej gry

Usługi gier Google Play nie obejmują wewnętrznej obsługi gier internetowych. Zapewnia jednak obsługę serwera backendu dla serwera gry na Androida.

Jeśli chcesz korzystać z interfejsów API REST dla usług Gier Google Play w aplikacji po stronie serwera, wykonaj te czynności:

  1. W grze w Konsoli Google Play kliknij Usługi gier Play > Konfiguracja i zarządzanie > Konfiguracja.
  2. Wybierz Dodaj dane logowania, aby przejść na stronę Dodaj dane logowania. Jako typ danych logowania wybierz Serwer gry i przejdź do sekcji Autoryzacja.
    1. Jeśli Twój serwer gry ma już identyfikator klienta OAuth, wybierz go z menu. Po zapisaniu zmian przejdź do następnej sekcji.
    2. Jeśli nie masz identyfikatora klienta OAuth dla swojego serwera gier, możesz go utworzyć.
      1. Kliknij Utwórz klienta OAuth i kliknij link Utwórz identyfikator klienta OAuth.
      2. Otworzy się strona Utwórz identyfikator klienta OAuth Google Cloud Platform dla projektu Cloud Platform powiązanego z Twoją grą.
      3. Wypełnij formularz strony i kliknij Utwórz. Pamiętaj, aby ustawić typ aplikacji na Internet.
      4. Wróć do sekcji Dodaj autoryzację na stronie danych logowania, wybierz nowo utworzonego klienta OAuth i zapisz zmiany.

Pobieranie kodu uwierzytelniania serwera

Aby pobrać kod uwierzytelniania serwera, którego Twoja gra może używać do tokenów dostępu na serwerze backendu:

  1. Zadzwoń do klienta requestServerSideAccess.

    1. Upewnij się, że używasz identyfikatora klienta OAuth zarejestrowanego na serwerze gry, a nie identyfikatora klienta OAuth aplikacji na Androida.
    2. (Opcjonalnie) Jeśli Twój serwer gry wymaga dostępu offline (długotrwały dostęp przy użyciu tokena odświeżania) do usług gier Play, możesz ustawić wartość forceRefreshToken na wartość prawda.
    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. Wyślij token kodu uwierzytelniania OAuth do serwera backendu, aby można go było wymienić, identyfikator gracza zweryfikowany za pomocą interfejsów API REST usług gier Play, a następnie uwierzytelniony za pomocą gry.

Wymiana kodu uwierzytelniania serwera na token dostępu na serwerze

Wyślij kod uwierzytelniania serwera do serwera backendu w celu wymiany tokenów dostępu i odświeżania. Używaj tokena dostępu do wywoływania interfejsu Google Play Games Services API w imieniu odtwarzacza. Opcjonalnie możesz zapisać token odświeżania, aby uzyskać nowy token dostępu po wygaśnięciu tokena dostępu.

Fragment kodu poniżej pokazuje, jak wdrożyć kod po stronie serwera w języku programowania Java, aby wymienić kod uwierzytelniania serwera na tokeny dostępu. Użyto przykładowej aplikacji 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;
}

Wywoływanie interfejsów API REST z serwera

Pełny opis dostępnych wywołań interfejsu API znajdziesz w artykule o interfejsach API REST dla usług Gier Google Play.

Przykładowe wywołania interfejsu API REST:

Zawodnik

  • Chcesz pobrać identyfikator i dane zalogowanego gracza? Wywołaj Players.get, podając identyfikator 'me'.

Grupa znajomych

Pamiętaj, aby zapoznać się z przewodnikiem Znajomi, w którym znajdziesz bardziej szczegółowe informacje o znajomych.

Osiągnięcia

Zapoznaj się dokładnie z przewodnikiem Osiągnięcia, w którym szczegółowo opisujemy osiągnięcia.

  • Chcesz zobaczyć listę bieżących osiągnięć? Możesz zadzwonić do OsiągnięciaDefinicje.list.
  • Połącz je z połączeniem na stronie Osiągnięcia.list, aby sprawdzić, które z nich zostały odblokowane.
  • Czy zawodnik zdobył osiągnięcie? Aby ją odblokować, użyj Osiągnięcia.unlock.
  • Czy gracz osiągnął częściowe osiągnięcie? Użyj raportu Osiągnięcia.increment, aby zgłosić postęp (i dowiedzieć się, czy gracz go odblokował).
  • Czy debugujesz grę, która nie jest jeszcze w wersji produkcyjnej? Spróbuj wywołać metodę Osiągnięcia.resetowanie lub Osiągnięcia.resetAll za pomocą interfejsów API zarządzania, aby zresetować osiągnięcia do pierwotnego stanu.

Tabele wyników

Zapoznaj się z przewodnikiem Tabele wyników, w którym szczegółowo wyjaśniamy tabele wyników.

  • Chcesz zobaczyć listę wszystkich tabel wyników w grze? Zadzwoń do Leaderboards.list.
  • Czy gracz kończy grę? Możesz przesłać ich wynik do Scores.submit, aby sprawdzić, czy to nowy rekord.
  • Chcesz wyświetlać tablicę wyników? Pobierz dane z Scores.list i wyświetl je użytkownikowi.
  • Użyj tabeli Scores.listWindow, aby znaleźć kolekcję wyników zbliżonych do najwyższych w rankingu użytkownika.
  • Aby dowiedzieć się więcej o wyniku gracza w danej tabeli wyników (np. jeśli należy on do 12% najlepszych graczy), zadzwoń pod numer Scores.get.
  • Debugujesz grę? Spróbuj wywołać interfejs Scores.reset za pomocą interfejsów API zarządzania, aby zresetować wszystkie wyniki danego gracza w poszczególnych tabelach wyników.