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

Jeśli gra korzysta z serwera backendu, zalecamy użycie tagu Logowanie przez Google do uwierzytelniania graczy bezpiecznie przekazać tożsamość gracza do serwera zaplecza. Umożliwia to także aby bezpiecznie pobierać tożsamość gracza i inne dane bez na potencjalne ingerencje w urządzenie.

W takim przypadku gra prosi gracza o zalogowanie się w usługach gier Google Play w zwykły sposób. Gdy odtwarzacz loguje się prawidłowo, obiekt GoogleSignInAccount zawiera specjalny jednorazowy kod (nazywany kodem autoryzacji serwera), który klient przekazuje na serwer. Następnie na serwerze kod uwierzytelniania serwera OAuth 2.0, którego serwer może używać do wywoływania Interfejs API usług gier Google Play.

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

Szczegółowy przykładowy kod pokazujący, jak korzystać z Logowania przez Google do uwierzytelniania graczy, znajdziesz w clientserverskeleton przykład w GitHubie.

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

  1. W Konsoli Google Play: utwórz dane logowania do serwera gier. Typ klienta OAuth danych logowania to „internet”.
  2. W aplikacji na Androida: podczas logowania poproś o kod autoryzacji serwera dla swojego dane logowania serwera i przekazać je do serwera.
  3. Na serwerze gry: wymieniaj kod autoryzacji serwera na potrzeby dostępu OAuth za pomocą usług uwierzytelniania Google, a następnie użyj go do wywołania metody Interfejsy API typu REST usług gier Play.

Zanim zaczniesz

Zanim będzie można zintegrować Logowanie przez Google z grą, musisz dodać swoją grę do Konsoli Google Play, jak opisano na stronie Konfigurowanie usług gier Google Play

Utwórz powiązaną z grą aplikację internetową po stronie serwera

Usługi gier Google Play nie zapewniają backendu i obsługuje gry internetowe. Zapewnia jednak obsługę serwerów backendu na serwer gry na Androida.

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

  1. Utwórz powiązaną aplikację internetową z grą w sekcji Połączone aplikacje w w Konsoli Google Play. Pamiętaj, że Pole launch_url nie jest używane w tym procesie i może być puste.
  2. Aby uzyskać dane logowania do aplikacji, wykonaj te czynności:
    1. Kliknij Szczegóły gry z poziomu gry w Konsoli Google Play.
    2. Przewiń w dół do sekcji Projekt konsoli API i kliknij link. z projektem w konsoli interfejsów API.
    3. Na stronie Interfejsy API Usługi > Ekran Dane logowania w interfejsie API Google Konsola, pobierz plik client_secret.json dla swojej aplikacji internetowej i zapisać ją w lokalizacji, do której ma dostęp Twój serwer. Nagrywanie klienta Identyfikator dokumentu do późniejszego wykorzystania.
  3. Ponownie uruchom aplikację po stronie serwera, aby mogła przyjmować żądania do aplikacji klienckiej gry.

Logowanie na kliencie

Klasa GoogleSignInClient jest głównym punktem wejścia, za pomocą którego pobiera się zalogowany odtwarzacz, a także zalogować się, jeśli jeszcze tego nie zrobił w Twojej aplikacji, urządzenia.

Aby utworzyć klienta logowania, wykonaj te czynności:

  1. Utwórz klienta logowania za pomocą obiektu GoogleSignInOptions. W GoogleSignInOptions.Builder, aby skonfigurować logowanie, musisz podać GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
  2. Musisz też określić, że gra wymaga uwierzytelniania dla serwera backendu przez wywołanie metody GoogleSignInOptions.Builder.requestServerAuthCode() z identyfikatorem klienta serwera jako . W przypadku tokenów dostępu na serwerze backendu pobierzesz później kod autoryzacji, zgodnie z opisem w artykule Uzyskiwanie kodu uwierzytelniania serwera.
  3. Wywołaj metodę GoogleSignIn.getClient() i przekaż skonfigurowane wcześniej opcje. Jeśli połączenie zostanie zwrócony, interfejs Google Sign-In API zwróci wystąpienie GoogleSignInClient.
  4. Po uzyskaniu instancji GoogleSignInClient możesz przejść do logowania odtwarzacza po cichu z onResume() aktywności, jak opisano w Przeprowadzam ciche logowanie.

Oto przykład:

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);
}

Uzyskiwanie kodu autoryzacji serwera

Aby pobrać kod uwierzytelniania serwera, którego gra może używać do uzyskiwania tokenów dostępu na serwerze backendu, Zadzwoń na getServerAuthCode() GoogleSignInAccount zwracany przez Logowanie przez Google po zalogowaniu się przez odtwarzacz.

Oto przykład:


// 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();
    }
  }
}

Wymiana kodu uwierzytelniania serwera na token dostępu na serwerze

Wyślij kod uwierzytelniania serwera do serwera backendu, aby wymienić go na tokeny dostępu i odświeżyć. Użyj tokena dostępu, aby wywołać interfejs Google Play Games Services API w imieniu gracza i opcjonalnie przechowywać token odświeżania, aby uzyskać nowy token dostępu po jego wygaśnięciu.

Poniższy fragment kodu pokazuje, jak możesz zaimplementować kod po stronie serwera w Javie za pomocą języka programowania i wymiany kodu uwierzytelniania serwera na tokeny dostępu. Jest za pomocą clientserverskeleton – przykładowa aplikacja:

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

Aby dowiedzieć się więcej o dostępie do interfejsów API Google z serwera backendu w imieniu zalogowanego odtwarzacza, Więcej informacji znajdziesz w sekcji Włączanie dostępu po stronie serwera.

Obsługa wylogowania gracza

Aby wylogować graczy z gry, wywołaj metodę signOut() na GoogleSignInClient. Dla przykładowy fragment kodu, zobacz Wylogowywanie gracza.

Wywoływanie interfejsów API typu REST z serwera

Zapoznaj się z interfejsami API typu REST dla usług Gier Google Play, aby dowiedzieć się więcej. pełny opis dostępnych wywołań interfejsu API.

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

Zawodnik

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

Znajomi

Zapoznaj się z przewodnikiem Znajomi, który zawiera więcej informacji o znajomych.

Osiągnięcia

Zapoznaj się z przewodnikiem Osiągnięcia, w którym opisujemy osiągnięcia. .

  • Chcesz zobaczyć listę aktualnych osiągnięć? Możesz wywołać stronę AchievementDefinitions.list.
  • Możesz to też połączyć z wywołaniem strony Achievements.list, aby dowiedzieć się, które z nich odblokował gracz.
  • Czy gracz zdobył osiągnięcie? Aby go odblokować, użyj platformy Achievements.unlock.
  • Czy gracz osiągnął częściowe osiągnięcie? Użyj rozszerzenia Achievements.increment, aby: zgłaszać postępy (i sprawdzić, czy gracz odblokował blok).
  • Czy debugujesz grę, która nie jest jeszcze w wersji produkcyjnej? Spróbuj zadzwonić Achievements.reset lub Achievements.resetAll w interfejsach API zarządzania. , by przywrócić osiągnięcia do ich pierwotnego stanu.

Tabele wyników

Zapoznaj się z przewodnikiem Tablice wyników, który zawiera więcej informacji.

  • Chcesz zobaczyć listę wszystkich tablic wyników w grze? Wezwij stronę Leaderboards.list.
  • Czy gracz kończy grę? Możesz przesłać ich wynik na Scores.submit, aby dowiedzieć się, czy to nowy rekord.
  • Chcesz wyświetlić tabelę wyników? Pobierz dane z witryny Scores.list i wyświetl je użytkownikowi.
  • Użyj narzędzia Scores.listWindow, aby znaleźć zbiór wyników bliskich rekordów użytkownika.
  • Aby uzyskać więcej informacji o wyniku gracza w określonej tabeli wyników (na przykład, jeśli należy do 12% najlepszych graczy), wywołaj Scores.get.
  • Debugujesz grę? Spróbuj wywołać Scores.reset z poziomu zarządzania interfejsy API do resetowania wszystkich wyników danego gracza z określonej tabeli wyników.