Ti consigliamo di utilizzare GamesSignInClient per autenticare i giocatori e trasferire in modo sicuro la loro identità al server di backend. In questo modo, il gioco può recuperare in modo sicuro l'identità del giocatore e altri dati senza essere esposto a potenziali manomissioni durante il passaggio attraverso il dispositivo.
Una volta eseguita l'autenticazione del giocatore, puoi richiedere un codice speciale monouso (chiamato codice di autenticazione del server) dall'SDK Play Games Services v2, che il client passa al server. Poi, sul server, scambia il codice di autenticazione del server con un token OAuth 2.0 che il server può utilizzare per effettuare chiamate all'API Google Play Games Services.
Per ulteriori indicazioni sull'aggiunta dell'autenticazione nei tuoi giochi, consulta la pagina Autenticazione della piattaforma per i giochi per Android.
Per l'accesso offline sono necessari i seguenti passaggi:
- In Google Play Console: crea una credenziale per il tuo server di gioco. Il tipo di client OAuth della credenziale sarà "web".
- Nell'app per Android: nell'ambito dell'autenticazione della piattaforma, richiedi un codice di autenticazione del server per le credenziali del server e trasmettilo al server.
GamesSigninClient
può richiedere tre ambiti OAuth 2.0 quando richiede l'accesso lato server alle API web di Play Games Services. Gli ambiti facoltativi sonoEMAIL
,PROFILE
eOPEN_ID
. I due ambiti predefiniti sonoDRIVE_APPFOLDER
eGAMES_LITE
. - Sul server di gioco: scambia il codice di autenticazione del server con un token di accesso OAuth utilizzando i servizi di autenticazione Google, quindi utilizzalo per chiamare le API REST dei servizi per i giochi di Play.
Prima di iniziare
Per prima cosa, devi aggiungere il gioco in Google Play Console, come descritto in Configurare i servizi per i giochi di Google Play e integrare l'autenticazione della piattaforma dei servizi per i giochi di Play con il tuo gioco.
Crea un'app web lato server
Google Play Services per i giochi non fornisce supporto di backend per i giochi web. Tuttavia, fornisce il supporto del server di backend per il server del tuo gioco per Android.
Se vuoi utilizzare le API REST per i servizi per i giochi di Google Play nella tua app lato server, segui questi passaggi:
- In Google Play Console, seleziona un gioco.
- Vai a Servizi per i giochi di Play > Configurazione e gestione > Configurazione.
- Seleziona Aggiungi credenziale per accedere alla pagina Aggiungi credenziale.
Seleziona Server di giochi come tipo di credenziale e continua con la sezione
Autorizzazione.
- Se il tuo server di gioco ha già un ID client OAuth, selezionalo dal menu a discesa. Dopo aver salvato le modifiche, passa alla sezione successiva.
- Se non hai un ID client OAuth esistente per il tuo server di giochi, puoi
crearne uno.
- Fai clic su Crea client OAuth e segui il link Crea ID client OAuth.
- Verrà visualizzata la pagina Crea ID client OAuth di Google Cloud Platform per il tuo progetto associato al gioco.
- Compila il modulo della pagina e fai clic su Crea. Assicurati di impostare il tipo di applicazione su Applicazione web.
- Torna alla sezione Autorizzazione della pagina Aggiungi credenziali, seleziona il client OAuth appena creato e salva le modifiche.
Recuperare il codice di autorizzazione del server
Per recuperare un codice di autenticazione del server che il tuo gioco può utilizzare per i token di accesso sul tuo server di backend:
- Chiamata a
requestServerSideAccess
da parte del cliente.- Assicurati di utilizzare l'ID client OAuth registrato per il tuo server di gioco e non l'ID client OAuth della tua applicazione per Android.
- (Facoltativo) Se il tuo server di gioco richiede l'accesso offline (accesso a lunga durata
utilizzando un token di aggiornamento) a Play Games Services, puoi impostare il
parametro
forceRefreshToken
su true.
(Facoltativo) Nell'ambito dell'autenticazione, i nuovi utenti dovrebbero visualizzare una singola schermata per il consenso per gli ambiti aggiuntivi. Dopo aver accettato il consenso, imposta il parametro
scopes
con gli ambiti OAuthEMAIL
,PROFILE
eOPEN_ID
. Se gli utenti rifiutano il consenso, al backend vengono inviati solo i due ambiti predefinitiDRIVE_APPFOLDER
eGAMES_LITE
.Schermata per il consenso per ambiti OAuth aggiuntivi. (fai clic per ingrandire). GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this); gamesSignInClient.requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= / false, / Additional AuthScope */ scopes) .addOnCompleteListener( task -> { if (task.isSuccessful()) { AuthResponse authresp = task.getResult(); // Send the authorization code as a string and a // list of the granted AuthScopes that were granted by the // user. Exchange for an access token. // Verify the player with Play Games Services REST APIs. } else { // Failed to retrieve authentication code. } });
Invia il token del codice di autorizzazione OAuth al server di backend in modo che possa essere scambiato, l'ID giocatore verificato rispetto alle API REST dei servizi per i giochi di Play e poi autenticato con il tuo gioco.
Invia il codice di autorizzazione del server
Invia il codice di autorizzazione del server al server di backend per scambiarlo con token di accesso e aggiornamento. Utilizza il token di accesso per chiamare l'API Play Games Services per conto del giocatore e, facoltativamente, memorizza il token di aggiornamento per acquisire un nuovo token di accesso quando quello attuale scade.
Il seguente snippet di codice mostra come potresti implementare il codice lato server nel linguaggio di programmazione Java per scambiare il codice di autorizzazione del server con token di accesso.
Java
/** * Exchanges the authcode for an access token credential. The credential * is 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(); TokenVerifier(tokenResponse); 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; }
Puoi recuperare gli ambiti OAuth utilizzando le
librerie client dell'API di Google
in Java o Python per ottenere l'oggetto GoogleIdTokenVerifier
. Il seguente snippet di codice mostra l'implementazione nel linguaggio di programmazione Java.
Java
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload; import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; /** * Gets the GoogleIdTokenVerifier object and additional OAuth scopes. * If additional OAuth scopes are not requested, the idToken will be null. * * @param tokenResponse - the tokenResponse passed from the exchangeAuthCode * function. * **/ void TokenVerifier(GoogleTokenResponse tokenResponse) { string idTokenString = tokenResponse.getIdToken(); GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory) // Specify the WEB_CLIENT_ID of the app that accesses the backend: .setAudience(Collections.singletonList(WEB_CLIENT_ID)) // Or, if multiple clients access the backend: //.setAudience(Arrays.asList(WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3)) .build(); GoogleIdToken idToken = verifier.verify(idTokenString); // The idToken can be null if additional OAuth scopes are not requested. if (idToken != null) { Payload payload = idToken.getPayload(); // Print user identifier String userId = payload.getSubject(); System.out.println("User ID: " + userId); // Get profile information from payload String email = payload.getEmail(); boolean emailVerified = Boolean.valueOf(payload.getEmailVerified()); String name = (String) payload.get("name"); String pictureUrl = (String) payload.get("picture"); String locale = (String) payload.get("locale"); String familyName = (String) payload.get("family_name"); String givenName = (String) payload.get("given_name"); // Use or store profile information // ... } else { System.out.println("Invalid ID token."); } }
Chiamare le API REST dal server
Consulta API REST per i servizi per i giochi di Google Play per una descrizione completa delle chiamate API disponibili.
Di seguito sono riportati alcuni esempi di chiamate API REST che potresti trovare utili:
Giocatore
Vuoi eseguire l'autenticazione con l'ID e i dati del profilo del giocatore? Chiama
Players.get
con 'me'
come ID.
Amici
Per maggiori dettagli, consulta la guida Amici.
Per recuperare l'elenco di amici del giocatore, chiama Players.list con
friends_all
comecollection
.Per verificare se hai accesso a un elenco di amici, chiama Players.get con
me
comeplayerID
e visualizza il campoprofileSettings.friendsListVisibility
nella risposta.
Obiettivi
Per maggiori dettagli, consulta la guida Risultati.
Per ottenere un elenco degli obiettivi attuali, chiama AchievementDefinitions.list.
Combina questa chiamata con una chiamata a Achievements.list per scoprire quali ha sbloccato il giocatore.
Chiama Achievements.unlock per sbloccare un obiettivo del giocatore.
Chiama Achievements.increment per segnalare i progressi compiuti per raggiungere un obiettivo e scoprire se il giocatore lo ha sbloccato.
Se stai eseguendo il debug di un gioco che non è ancora in produzione, puoi chiamare Achievements.reset o Achievements.resetAll dalle API di gestione per reimpostare gli obiettivi al loro stato originale.
Classifiche
Per maggiori dettagli, consulta la guida alle classifiche.
Vuoi ottenere un elenco di tutte le classifiche del gioco? Chiama Leaderboards.list.
Se un giocatore ha terminato una partita, puoi inviare il suo punteggio a Scores.submit e scoprire se si tratta di un nuovo miglior punteggio.
Per visualizzare una classifica, recupera i dati da Scores.list e mostrali all'utente.
Utilizza Scores.listWindow per trovare un assortimento di punteggi vicini al punteggio più alto dell'utente.
Per ottenere maggiori informazioni sul punteggio del giocatore in una determinata classifica (ad esempio, se il giocatore si trova nel 12% dei migliori giocatori), chiama Scores.get.
Se esegui il debug di un gioco, puoi chiamare Scores.reset dalle API di gestione per reimpostare tutti i punteggi di un giocatore in una determinata classifica.