Activer l'accès côté serveur aux services de jeux Google Play

Nous vous recommandons d'authentifier les joueurs et de transmettre leur identité au serveur backend de manière sécurisée. Cela permet à votre jeu de récupérer de manière sécurisée l'identité du joueur et d'autres données sans être exposé à des tentatives de falsification lors de son passage sur l'appareil.

Dans ce scénario, une fois que se connecte avec succès, vous pouvez demander un code spécial à usage unique (appelé code d'autorisation du serveur) issu de la version 2 du SDK des services de jeux Play, que le client transmet au serveur. Ensuite, sur le serveur, échangez le code d'autorisation du serveur associé à un jeton OAuth 2.0 que le serveur peut utiliser pour appeler la API Google Play Games Services.

Pour obtenir des conseils supplémentaires sur l'ajout de la connexion dans vos jeux, consultez Connectez-vous aux jeux Android.

Pour utiliser l'accès hors connexion, procédez comme suit :

  1. Dans la Google Play Console, créez des identifiants pour votre serveur de jeu. La Le type de client OAuth pour les identifiants sera "web".
  2. Dans l'application Android : lors de la procédure de connexion, demandez un code d'autorisation pour les identifiants de votre serveur et transmettez-les lui.
  3. Sur votre serveur de jeu: échangez le code d'autorisation du serveur contre un accès OAuth à l'aide des services d'authentification Google, puis utilisez-le pour appeler API REST des services de jeux Play

Avant de commencer

Vous devez d'abord ajouter votre jeu dans Google Play Console, comme décrit dans Configurez les services de jeux Google Play et intégrez la fonctionnalité de connexion aux services de jeux Play à votre jeu.

Créer une application Web côté serveur associée à votre jeu

Les services de jeux Google Play ne proposent pas de backend pour les jeux Web. Toutefois, un serveur backend est disponible pour le serveur de votre jeu Android.

Si vous souhaitez utiliser les API REST pour les services de jeux Google Play dans votre application côté serveur, procédez comme suit :

  1. Depuis votre jeu dans la Google Play Console, accédez à Play Game Services > Setup and management > Configuration (Services de jeux Play > Configuration et gestion > Configuration).
  2. Sélectionnez Add credential (ajouter des identifiants) pour accéder à la page correspondante. Sélectionnez Game server (serveur de jeu) comme type d'identifiant, puis passez à la section Authorization (autorisation).
    1. Si votre serveur de jeu dispose déjà d'un ID client OAuth, sélectionnez-le dans le menu déroulant. Après avoir enregistré vos modifications, passez à la section suivante.
    2. Si vous ne disposez d'aucun ID client OAuth pour votre serveur de jeu, vous pouvez en créer un.
      1. Cliquez sur Create OAuth client (créer un client OAuth), puis sur le lien Create OAuth client.
      2. Vous êtes redirigé vers la page Create OAuth client ID (créer un ID client OAuth) de Google Cloud Platform pour le projet Cloud Platform associé à votre jeu.
      3. Remplissez le formulaire, puis cliquez sur "Create" (Créer). Veillez à définir le type d'application sur Web.
      4. Revenez à la section Authorization de la page d'ajout des identifiants, sélectionnez le client OAuth que vous venez de créer, puis enregistrez vos modifications.

Obtenir le code d'autorisation du serveur

Pour récupérer un code d'autorisation de serveur que votre jeu peut utiliser pour les jetons d'accès sur votre serveur backend, procédez comme suit :

  1. Appelez requestServerSideAccess à partir du client.

    1. Veillez à utiliser l'ID client OAuth enregistré pour votre serveur de jeu et non l'ID client OAuth de votre application Android.
    2. (Facultatif) Si votre serveur de jeu nécessite un accès hors connexion (accès de longue durée avec un jeton d'actualisation) aux services de jeux Play, vous pouvez définir le paramètre "forceRefreshToken" sur "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. Envoyez le jeton de code d'autorisation OAuth au serveur backend pour qu'il puisse être échangé. L'ID de joueur est validé par les API REST des services de jeux Play, puis authentifié auprès de votre jeu.

Échanger le code d'autorisation du serveur contre un jeton d'accès sur le serveur

Envoyez le code d'autorisation du serveur à votre serveur backend pour l'échanger contre des jetons d'accès et d'actualisation. Utiliser le jeton d'accès pour appeler l'API des services de jeux Google Play au nom du joueur et, éventuellement, stocker le jeton d'actualisation pour obtenir un nouveau jeton d'accès lorsqu'il expire.

L'extrait de code suivant vous montre comment implémenter le code côté serveur dans l'API de programmation pour échanger le code d’autorisation du serveur contre des jetons d’accès. Il est à l'aide du application exemple 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;
}

Appeler des API REST à partir du serveur

Consultez API REST pour les services de jeux Google Play afin de découvrir une description complète des appels d'API disponibles.

Voici des exemples d'appels d'API REST qui peuvent vous être utiles :

Joueur

  • Si vous souhaitez obtenir l'ID du joueur connecté et les données de son profil, Appeler Players.get avec l'ID 'me'.

Amis

Pensez à consulter le guide des amis, qui explique en détail le fonctionnement des amis.

Réussites

Veillez à consulter le guide des réussites, qui explique les réussites plus en détail.

  • Vous voulez obtenir la liste des réussites en cours ? Vous pouvez appeler la méthode AchievementDefinitions.list.
  • Combinez cela avec un appel à Achievements.list pour identifier celles que le joueur a déverrouillées.
  • Le joueur a-t-il obtenu une réussite ? Utilisez Achievements.unlock pour la débloquer.
  • Le joueur a-t-il progressé vers une réussite partielle ? Utilisez Achievements.increment pour rendre compte de la progression (et savoir si le joueur l'a déverrouillée).
  • Déboguer un jeu qui n'est pas encore en production ? Essayez d'appeler Achievements.reset ou Achievements.resetAll à partir des API de gestion pour rétablir l'état d'origine des réussites.

Classements

Veillez à consulter le guide Classements, qui explique en détail les classements.

  • Si vous voulez obtenir la liste de tous les classements dans le jeu, Appelez Leaderboards.list.
  • Le joueur a-t-il terminé un jeu ? Vous pouvez envoyer son score à Scores.submit pour savoir si c'est un nouveau record.
  • Vous souhaitez afficher un classement ? Récupérez les données de Scores.list et présentez-les à l'utilisateur.
  • Utilisez Scores.listWindow pour trouver des scores proches du record de l'utilisateur.
  • Pour obtenir plus d'informations sur le score d'un joueur dans un classement particulier (par exemple, si le figure dans le top 12% des joueurs), appelez Scores.get.
  • Vous déboguez un jeu ? Essayez d'appeler Scores.reset à partir du gestionnaire API permettant de réinitialiser tous les scores d'un joueur donné dans un classement particulier