Accesso lato server ai servizi per i giochi di Google Play

Ti consigliamo di autenticare i giocatori trasferire in modo sicuro l'identità del player al server di backend. Ciò consente il tuo gioco per recuperare in modo sicuro l'identità del giocatore e altri dati senza essere esposti a potenziali manomissioni durante il passaggio attraverso il dispositivo.

In questo scenario, una volta che il giocatore ha eseguito l'accesso, puoi richiedere un speciale codice monouso (chiamato codice di autenticazione del server) del programma Play Giochi SDK Services v2, che il client passa al server. Poi, sul server, scambiano il codice di autorizzazione del server con un token OAuth 2.0 che il server può utilizzare per effettuare chiamate all'API dei servizi per i giochi di Google Play.

Per ulteriori indicazioni sull'aggiunta dell'accesso nei tuoi giochi, vedi Accedi ai giochi Android.

Per l'accesso offline sono necessari i seguenti passaggi:

  1. In Google Play Console: crea una credenziale per il tuo server di gioco. Il tipo di client OAuth della credenziale sarà "web".
  2. Nell'app per Android: come parte della procedura di accesso, richiedi un codice di autenticazione del server per le credenziali del server e passarle al server.
  3. Sul server di gioco: sostituisci il codice di autenticazione del server con un accesso OAuth utilizzando i servizi di autenticazione di Google, e poi utilizzarlo per chiamare Servizi per i giochi di Play API REST.

Prima di iniziare

Per prima cosa dovrai aggiungere il gioco nel Google Play Console, come descritto in Configurare i servizi per i giochi di Google Play e integrare l'accesso ai servizi per i giochi di Play nel tuo gioco.

Creare un'app web lato server

I servizi per i giochi di Google Play non forniscono back-end per i giochi web. Tuttavia, fornisce il supporto server back-end per il server del tuo gioco Android.

Se vuoi utilizzare API REST per i servizi Google Play Giochi nell'app lato server:

  1. Dal tuo gioco in Google Play Console, vai a Servizi per i giochi di Play > Configurazione e gestione > Configurazione.
  2. Seleziona Aggiungi credenziale per accedere alla pagina Aggiungi credenziale. Seleziona Server di gioco come tipo di credenziali e vai alla sezione Autorizzazione.
    1. Se il server di gioco ha già un ID client OAuth, selezionalo dal menu a discesa. Dopo aver salvato le modifiche, passa alla sezione successiva.
    2. Se non disponi di un ID client OAuth esistente per il tuo server di gioco, puoi crearne uno.
      1. Fai clic su Crea client OAuth e segui il link Crea ID client OAuth.
      2. Verrà visualizzata la pagina Crea ID client OAuth della piattaforma Google Cloud per il progetto Cloud Platform associato al tuo gioco.
      3. Compila il modulo della pagina e fai clic su Crea. Assicurati di impostare Tipo di applicazione su Applicazione web.
      4. Torna alla sezione Aggiungi autorizzazione della pagina delle credenziali, seleziona il client OAuth appena creato e salva le modifiche.

Recupera il codice di autorizzazione del server

Per recuperare un codice di autorizzazione del server che il tuo gioco può utilizzare per i token di accesso sul tuo server di backend:

  1. Chiama requestServerSideAccess dal client.

    1. Assicurati di utilizzare l'ID client OAuth registrato per il server di gioco e non l'ID client OAuth della tua applicazione Android.
    2. (Facoltativo) Se il tuo server di gioco richiede l'accesso offline (accesso di lunga durata tramite un token di aggiornamento) ai servizi per i giochi di Play, puoi impostare il parametro forceRefreshToken su 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. Invia il token del codice di autenticazione OAuth al tuo server di backend in modo che possa essere scambiato, verificato l'ID giocatore in base alle API REST dei servizi per i giochi di Play e quindi autenticato con il tuo gioco.

Invia il codice di autorizzazione del server

Invia il codice di autorizzazione del server al server di backend per lo scambio dell'accesso e di aggiornamento. Usa il token di accesso per chiamare l'API Play Games Services su per conto del player e, facoltativamente, memorizzare il token di aggiornamento per acquisire alla scadenza del token di accesso.

Il seguente snippet di codice mostra come implementare il codice lato server in il linguaggio di programmazione Java per scambiare il codice di autorizzazione del server per l'accesso di token. Utilizza la classe esempio di app 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;
}

Chiama le API REST dal server

Vedi API REST per i servizi Google Play Giochi per una descrizione completa delle chiamate API disponibili.

Ecco alcuni esempi di chiamate API REST che potrebbero esserti utili:

Giocatore

Vuoi ricevere l'ID e i dati del profilo del giocatore che ha eseguito l'accesso? Chiama [Players.get][] con 'me' come ID.

Amici

Consulta la guida Amici per maggiori dettagli.

Obiettivi

Per informazioni dettagliate, consulta la guida Obiettivi.

  • Per visualizzare un elenco degli obiettivi attuali, chiama AchievementDefinitions.list.

  • Combinalo con una chiamata a Obiettivi.elenco per scoprire quali sono state sbloccate dal giocatore.

  • Chiama Obiettivi.unlock per sbloccare un obiettivo giocatore.

  • Chiama Obiettivi.incrementali per segnalare i progressi fatti in un obiettivo e scoprire se il giocatore l'ha sbloccato.

  • Se stai eseguendo il debug di un gioco che non ha ancora raggiunto la versione di produzione, puoi richiamare Obiettivi.reset o Achievements.resetAll dalle API di gestione per ripristinare lo stato originale degli obiettivi.

Classifiche

Per informazioni dettagliate, consulta la guida Classifiche.

  • Vuoi ottenere un elenco di tutti i tabelloni punti del gioco? Fai una chiamata a Leaderboards.list.

  • Se un giocatore ha finito con un gioco, puoi inviare il suo punteggio a Scores.submit e scoprire se si tratta di un nuovo miglior punteggio.

  • Per visualizzare una classifica, ottieni i dati da Scores.list e mostrarla all'utente.

  • Utilizza Scores.listWindow per trovare vari punteggi simili a quelli più alti dell'utente.

  • Per avere maggiori informazioni sul punteggio di un giocatore in una determinata classifica (ad esempio, se il giocatore si trova nel 12% dei migliori giocatori), richiama Scores.get.

  • Se esegui il debug di un gioco, puoi richiamare Scores.reset dalle API di gestione per reimpostare tutti i punteggi di quel giocatore da un classifica.