Dostęp po stronie serwera do usług gier Google Play

Zalecamy uwierzytelnianie graczy i bezpieczne przekazywanie ich tożsamości do serwera backendu. Dzięki temu gra może bezpiecznie pobierać tożsamość gracza i inne dane bez narażenia na potencjalne ingerencje podczas przesyłania przez urządzenie.

W takiej sytuacji po zalogowaniu się możesz w pakiecie SDK usług gier Play w wersji 2 poprosić o specjalny kod jednorazowy (nazywany kodem autoryzacji serwera), który klient przekazuje na serwer. Następnie na serwerze wymień kod autoryzacji serwera na token OAuth 2.0, którego serwer może używać do wywoływania interfejsu Google Play Games Services API.

Dodatkowe wskazówki dotyczące dodawania logowania w grach znajdziesz w artykule Logowanie się w grach na Androida.

Aby uzyskać dostęp w trybie offline, należy wykonać następujące czynności:

  1. W Konsoli Google Play: utwórz dane logowania do serwera gry. Typ klienta OAuth dla danych logowania to „internet”.
  2. W aplikacji na Androida: w ramach logowania się zażądaj kodu autoryzacji serwera dla danych logowania do serwera i przekaż go na swój serwer.
  3. Na serwerze gry: wymień kod autoryzacji serwera na potrzeby tokena dostępu OAuth, korzystając z usług uwierzytelniania Google, a potem 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 się w usługach gier Play.

Tworzenie aplikacji internetowej po stronie serwera

Usługi gier Google Play nie zapewniają wewnętrznej obsługi gier internetowych. Daje on jednak wsparcie serwera Twojej gry na Androida.

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

  1. W Konsoli Google Play w swojej grze kliknij Usługi gier Play > Konfiguracja i zarządzanie > Konfiguracja.
  2. Wybierz Add credential, aby przejść na stronę Dodaj dane logowania. Jako typ danych logowania wybierz Serwer gier 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 na potrzeby serwera gry, 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 w Google Cloud Platform powiązanego z projektem Cloud Platform powiązanym z Twoją grą.
      3. Wypełnij formularz na stronie i kliknij Utwórz. Pamiętaj, aby ustawić Typ aplikacji na Aplikacja internetowa.
      4. Wróć do sekcji Autoryzacja na stronie dodawania danych logowania, wybierz nowo utworzonego klienta OAuth i zapisz zmiany.

Uzyskiwanie kodu autoryzacji serwera

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

  1. Wywołaj numer requestServerSideAccess z klienta.

    1. Upewnij się, że używasz identyfikatora klienta OAuth zarejestrowanego na serwerze gry, a nie identyfikatora klienta OAuth swojej aplikacji na Androida.
    2. (Opcjonalnie) Jeśli serwer gier wymaga dostępu offline do usług gier Play (dostęp o długim okresie ważności za pomocą tokena odświeżania), możesz ustawić parametr forcerefreshToken na „true”.
    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 autoryzacji OAuth do serwera backendu, aby go wymienić. Identyfikator gracza został zweryfikowany w interfejsach API REST usług gier Play, a następnie uwierzytelniony w Twojej grze.

Wyślij kod autoryzacji serwera

Wyślij kod autoryzacji serwera na swój serwer backendu, aby wymieniać tokeny dostępu i odświeżenia. Użyj tokena dostępu, aby w imieniu gracza wywoływać interfejs API usług gier Play. Opcjonalnie możesz zapisać token odświeżania, aby uzyskać nowy token dostępu po jego wygaśnięciu.

Poniższy fragment kodu pokazuje, jak możesz wdrożyć kod po stronie serwera w języku programowania Java, aby wymieniać kod uwierzytelniania serwera na tokeny dostępu. Wykorzystuje przykładową aplikację szkielet serwera klienta.

/**
 * 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łuj interfejsy API REST z serwera

Pełny opis dostępnych wywołań interfejsu API znajdziesz w sekcji Interfejsy API typu REST w usługach gier Google Play.

Przykłady wywołań interfejsu API REST, które mogą Ci się przydać, to:

Zawodnik

Chcesz poznać identyfikator i dane z profilu zalogowanego gracza? Wywołaj [Players.get][], podając 'me' jako identyfikator.

Znajomi

Szczegółowe informacje znajdziesz w przewodniku Znajomi.

Osiągnięcia

Więcej informacji znajdziesz w przewodniku po osiągnięciach.

  • Aby zobaczyć listę aktualnych osiągnięć, wywołaj AchievementDefinitions.list.

  • Połącz to z wywołaniem strony Achievements.list, by sprawdzić, które z nich odblokował gracz.

  • Aby odblokować osiągnięcie gracza, wywołaj Achievements.unlock.

  • Wywołaj funkcję Achievements.increment, aby zgłaszać postępy w osiągnięciu i sprawdzać, czy gracz je odblokował.

  • Jeśli debugujesz grę, która nie została jeszcze udostępniona w wersji produkcyjnej, w interfejsach API do zarządzania możesz wywołać metodę Achievements.reset lub Achievements.resetAll, by zresetować osiągnięcia do ich pierwotnego stanu.

Tabele wyników

Szczegółowe informacje znajdziesz w przewodniku Tabele wyników.

  • Chcesz zobaczyć listę wszystkich tablic wyników w grze? Utwórz wywołanie do Leaderboards.list.

  • Gdy gracz ukończy grę, możesz przesłać jego wynik do Scores.submit i sprawdzić, czy osiągnął nowy rekord.

  • Aby wyświetlić tabelę wyników, pobierz dane ze strony Scores.list i pokaż je użytkownikowi.

  • Użyj Scores.listWindow, aby znaleźć zbiór wyników zbliżony do rekordu użytkownika.

  • Aby uzyskać więcej informacji o wyniku gracza w danej tabeli (np. jeśli należy do najlepszych 12% wszystkich graczy), użyj funkcji Scores.get.

  • Jeśli debugujesz grę, możesz wywołać metodę Scores.reset w interfejsach API zarządzania, by zresetować wszystkie wyniki danego gracza z określonej tabeli wyników.