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

Jeśli gra korzysta z serwera backendu, zalecamy użycie logowania przez Google do uwierzytelniania graczy i bezpiecznego przekazywania ich tożsamości do serwera backendu. Pozwala to też bezpiecznie pobierać tożsamość gracza i inne dane bez ujawniania potencjalnej ingerencji w urządzenie.

W takim przypadku Twoja gra zawsze prosi użytkownika o zalogowanie się w usługach gier Google Play. Gdy odtwarzacz się zaloguje, obiekt GoogleSignInAccount zawiera specjalny jednorazowy kod (nazywany kodem uwierzytelniania serwera), 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 zobaczyć szczegółowy przykładowy kod pokazujący, jak używać logowania przez Google do uwierzytelniania graczy, zobacz przykład clientserverskeleton na GitHubie.

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

Zanim zintegrujesz z grą Logowanie przez Google, musisz dodać grę w Konsoli Google Play zgodnie z opisem w artykule Konfigurowanie usług gier Google 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. Utwórz powiązaną aplikację internetową w swojej grze w sekcji Połączone aplikacje w Konsoli Google Play. Pamiętaj, że launch_url nie jest używany w tym procesie i może być pusty.
  2. Aby uzyskać dane logowania do aplikacji, wykonaj te czynności:
    1. W grze w Konsoli Google Play kliknij Szczegóły gry.
    2. Przewiń w dół do sekcji Projekt w konsoli API i kliknij link do projektu w konsoli API.
    3. Na ekranie Interfejsy API i usługi & gt; Dane logowania w konsoli interfejsu Google API pobierz plik client_secret.json aplikacji internetowej i zapisz go w lokalizacji, do której Twój serwer ma dostęp. Zapisz identyfikator klienta danych uwierzytelniających na później.
  3. Ponownie uruchom aplikację po stronie serwera, aby móc przyjmować żądania od aplikacji klienckiej gry.

Logowanie się na kliencie

Klasa GoogleSignInClient to główny punkt wejścia, który ma być używany do pobierania konta użytkownika, na którym jesteś obecnie zalogowany, oraz do logowania się, jeśli nie zrobiono tego wcześniej w Twojej aplikacji na urządzeniu.

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

  1. Utwórz klienta logowania za pomocą obiektu GoogleSignInOptions. W GoogleSignInOptions.Builder musisz skonfigurować logowanie, klikając GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.
  2. Musisz też określić, że gra wymaga kodu autoryzacji serwera backendu, wywołując metodę GoogleSignInOptions.Builder.requestServerAuthCode() z identyfikatorem klienta serwera jako parametrem. Później uzyskasz kod autoryzacji dla tokenów dostępu na serwerze backendu zgodnie z opisem w sekcji Pobieranie kodu uwierzytelniania serwera.
  3. Wywołaj metodę GoogleSignIn.getClient() i przekaż skonfigurowane wcześniej opcje. Jeśli wywołanie się powiedzie, interfejs Google Sign-In API zwróci instancję GoogleSignInClient.
  4. Po uzyskaniu dostępu do instancji GoogleSignInClient należy zalogować się w trybie cichym z onResume() działania, zgodnie z opisem w sekcji Wykonywanie cichego logowania.

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

Pobieranie kodu uwierzytelniania serwera

Aby pobrać kod uwierzytelniania serwera, którego Twoja gra może używać w tokenach dostępu na serwerze backendu, wywołaj metodę getServerAuthCode() w obiekcie GoogleSignInAccount, która jest zwracana przez funkcję logowania Google.

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

Aby dowiedzieć się więcej o uzyskiwaniu dostępu do interfejsów API Google z serwera backendu w imieniu zalogowanego gracza, zobacz Włączanie dostępu po stronie serwera.

Wyloguj się z nicka

Aby wylogować graczy z gry, wywołaj metodę signOut() na urządzeniu GoogleSignInClient. Przykładowy fragment kodu znajdziesz w artykule Wylogowywanie się.

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.