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:
- W Konsoli Google Play: utwórz dane logowania na serwer gry. Typ danych uwierzytelniających klienta OAuth to „web”.
- W aplikacji na Androida: podczas logowania poproś o kod autoryzacji serwera i prześlij go na swój serwer.
- 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:
- 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. - Aby uzyskać dane logowania do aplikacji, wykonaj te czynności:
- W grze w Konsoli Google Play kliknij Szczegóły gry.
- Przewiń w dół do sekcji Projekt w konsoli API i kliknij link do projektu w konsoli API.
- 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.
- 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:
- Utwórz klienta logowania za pomocą obiektu
GoogleSignInOptions
. WGoogleSignInOptions.Builder
musisz skonfigurować logowanie, klikającGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
. - 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. - 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
. - Po uzyskaniu dostępu do instancji
GoogleSignInClient
należy zalogować się w trybie cichym zonResume()
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.
- Chcesz pobrać listę znajomych gracza? Wywołaj Players.list, podając
collection
jako'friends_all'
. - Sprawdź, czy masz dostęp do listy znajomych. Wywołaj Players.get dla
me
i sprawdź poleprofileSettings.friendsListVisibility
w odpowiedzi.
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.