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

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

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

Więcej wskazówek na temat dodawania logowania w grach znajdziesz w artykule Logowanie w grach na Androida.

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

  1. W Konsoli Google Play: utwórz dane logowania do serwera gry. Typ klienta OAuth danych logowania to „web” (sieć).
  2. W aplikacji na Androida: w ramach logowania poproś o kod uwierzytelniający serwer dla danych logowania serwera i przekaż go na serwer.
  3. Na serwerze gry: za pomocą usług uwierzytelniania Google zastąp kod autoryzacji serwera tokenem dostępu OAuth, a potem używaj go do wywoływania interfejsów REST API 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, a następnie zintegrować z nią logowanie w usługach gier Google Play.

Tworzenie aplikacji internetowej po stronie serwera

Usługi Google Play dotyczące gier nie zapewniają obsługi backendu dla gier w przeglądarce. Zapewnia jednak obsługę serwera backendu dla serwera gry na Androida.

Jeśli chcesz używać interfejsów API REST do usług Google Play Games w aplikacji po stronie serwera, wykonaj te czynności:

  1. Konsoli Google Play wybierz grę.
  2. Kliknij Usługi gier Play > Konfiguracja i zarządzanie > Konfiguracja.
  3. Kliknij Dodaj dane logowania, aby przejść na stronę Dodawanie danych logowania. Jako typ danych logowania wybierz Serwer gier i przejdź do sekcji Autoryzacja.
    1. Jeśli serwer gier 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 gier, możesz go utworzyć.
      1. Kliknij Utwórz klienta OAuth i postępuj zgodnie z instrukcjami w sekcji Utwórz identyfikator klienta OAuth.
      2. Spowoduje to otwarcie strony Tworzenie identyfikatora klienta OAuth w Google Cloud Platform dla projektu powiązanego z Twoją grą.
      3. Wypełnij formularz strony i kliknij Utwórz. Upewnij się, że jako typ aplikacji ustawisz Aplikacja internetowa.
      4. Wróć do sekcji Autoryzacja na stronie Dodaj dane logowania, wybierz nowo utworzonego klienta OAuth i zapisz zmiany.

Pobieranie kodu autoryzacji serwera

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

  1. Zadzwoń pod numer requestServerSideAccess z telefonu klienta.

    1. Upewnij się, że używasz identyfikatora klienta OAuth zarejestrowanego dla serwera gry, a nie identyfikatora klienta OAuth Twojej aplikacji na Androida.
    2. (Opcjonalnie) Jeśli serwer gry wymaga dostępu offline (długotrwałego dostępu za pomocą tokena odświeżania) do Usług w Grach Play, możesz ustawić parametr forceRefreshToken na wartość 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. Wysyłanie tokena kodu autoryzacji OAuth do serwera backendu, aby można go było wymienić, sprawdzanie identyfikatora gracza w interfejsach REST usług gier Play, a następnie uwierzytelnianie go w grze.

Wysyłanie kodu uwierzytelniania serwera

Wyślij kod autoryzacji serwera do serwera backendu, aby wymienić go na tokeny dostępu i odświeżania. Użyj tokena dostępu, aby wywołać interfejs Play Games Services API w imieniu gracza, i opcjonalnie zapisz token odświeżania, aby po upływie ważności tokena dostępu pobrać nowy.

Ten fragment kodu pokazuje, jak zastosować kod po stronie serwera w języku programowania Java, aby zamienić kod uwierzytelniający serwer na tokeny dostępu. Używa ona 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 shouldn't 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 Interfejsy REST API usług gier Google Play.

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

Zawodnik

Chcesz poznać identyfikator i dane profilu zalogowanego gracza? Zadzwoń do Players.get z identyfikatorem 'me'.

Znajomi

Szczegółowe informacje znajdziesz w przewodniku po usłudze Znajomi.

  • Aby pobrać listę znajomych gracza, wywołaj funkcję Players.list z wartością friends_all jako collection.

  • Aby sprawdzić, czy masz dostęp do listy znajomych, wywołaj funkcję Players.get z wartością me w parametrye playerID i sprawdź pole profileSettings.friendsListVisibility w odpowiedzi.

Osiągnięcia

Szczegółowe informacje znajdziesz w przewodniku Osiągnięcia.

  • Aby uzyskać listę bieżących osiągnięć, wywołaj funkcję AchievementDefinitions.list.

  • Połącz to z wywołaniem Achievements.list, aby dowiedzieć się, które z nich gracz odblokował.

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

  • Aby zgłosić postępy w uzyskiwaniu osiągnięcia i sprawdzić, czy gracz je odblokował, wywołaj funkcję Achievements.increment.

  • Jeśli debugujesz grę, która nie została jeszcze wdrożona, możesz wywołać Achievements.reset lub Achievements.resetAll z interfejsów Management API, aby przywrócić osiągnięcia do ich pierwotnego stanu.

Tabele wyników

Szczegółowe informacje znajdziesz w tabeli liderów.

  • Chcesz zobaczyć listę wszystkich tablic wyników w grze? Wywołaj funkcję Leaderboards.list.

  • Jeśli gracz skończył grę, możesz przesłać jego wynik za pomocą wywołania Scores.submit i sprawdzić, czy jest to nowy rekord.

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

  • Użyj funkcji Scores.listWindow, aby znaleźć asortyment wyników zbliżonych do najwyższego wyniku użytkownika.

  • Aby uzyskać więcej informacji o wyniku gracza na danej tablicy wyników (np. czy należy do 12% najlepszych graczy), wywołaj funkcję Scores.get.

  • Jeśli debugujesz grę, możesz wywołać Scores.reset z Management API, aby zresetować wszystkie wyniki danego gracza na konkretnej tablicy liderów.