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 le joueur s'est connecté avec succès, vous pouvez demander un code spécial à usage unique (appelé code d'authentification de serveur) auprès du SDK des services de jeux v2, que le client transmet au serveur. Ensuite, sur le serveur, échangez le code d'authentification du serveur contre un jeton OAuth 2.0 permettant au serveur d'appeler l'API des services de jeux Google Play.

Pour obtenir des conseils supplémentaires sur l'ajout de la connexion dans vos jeux, consultez Se connecter dans les 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. Le type de client OAuth des 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: remplacez le code d'authentification du serveur par un jeton d'accès OAuth à l'aide des services d'authentification Google, puis utilisez-le pour appeler les API REST des services de jeux Play.

Avant de commencer

Vous devez d'abord ajouter votre jeu dans la console Google Play, comme décrit dans la section Configurer les services de jeux Google Play et intégrer Play Services Services Sign-In à votre jeu.

Créer une application Web côté serveur pour 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. 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'authentification du serveur contre un jeton d'accès sur le serveur

Envoyez le code d'authentification du serveur à votre serveur backend pour échanger des jetons d'accès et d'actualisation. Utilisez 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 acquérir un nouveau jeton d'accès lorsque le jeton d'accès expire.

L'extrait de code suivant montre comment implémenter le code côté serveur dans le langage de programmation Java afin d'échanger le code d'authentification du serveur contre des jetons d'accès. Il utilise l'exemple d'application 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

Reportez-vous à la page API REST pour les services Google Play Jeux pour obtenir 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, Appelez Players.get avec l’ID 'me'.

Amis

Veillez à consulter le guide Amis, qui explique plus en détail les amis.

Réussites

Assurez-vous de consulter le guide Réussites, qui explique plus en détail les réussites.

  • Vous souhaitez obtenir la liste des succès en cours ? Vous pouvez appeler AchievementDefinitions.list.
  • Combinez-le à un appel à Achievements.list pour découvrir ceux que le joueur a déverrouillés.
  • Le joueur a-t-il obtenu une réussite ? Utilisez Achievements.unlock pour le déverrouiller :
  • Le joueur a-t-il progressé de façon partielle ? Utilisez Achievements.increment pour signaler la progression (et voir si le joueur l'a déverrouillé).
  • Vous déboguez 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 leur état d'origine.

Classements

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

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