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 se connecte, vous pouvez demander un code unique à usage unique (appelé code d'autorisation du serveur) au SDK des services de jeux Play v2, que le client transmet au serveur. Ensuite, sur le serveur, échangez le code d'autorisation 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 Procédure de connexion dans le contexte des 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 pour ces identifiants est "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 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 Google Play Console, comme décrit dans la section Configurer les services de jeux Google Play, puis intégrer la connexion via les services de jeux Play dans votre jeu.

Créer une application Web côté serveur

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. Dans la Google Play Console, sélectionnez un jeu.
  2. Accédez à Play Games Services > Setup and management > Configuration (Services de jeux Play > Configuration et gestion > Configuration).
  3. 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 associé à votre jeu.
      3. Remplissez le formulaire, puis cliquez sur "Create" (Créer). Veillez à définir le type d'application sur "Application Web".
      4. Revenez à la section Authorization (Autorisation) 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:

  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.

Envoyer le code d'autorisation du serveur

Envoyez le code d'autorisation à votre serveur backend pour l'échanger contre des jetons d'accès et d'actualisation. Utilisez le jeton d'accès pour appeler l'API des services de jeux Play au nom du joueur et, éventuellement, stocker le jeton d'actualisation pour acquérir un nouveau jeton d'accès lorsque le jeton existant expirera.

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'autorisation du serveur contre des jetons d'accès. Il utilise l'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 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();

    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

Pour obtenir une description complète des appels d'API disponibles, consultez la page API REST pour les services Google Play Jeux.

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 'me' comme ID.

Amis

Pour en savoir plus, consultez ce guide.

Récompenses

Pour en savoir plus, consultez ce guide.

Classements

Pour en savoir plus, consultez ce guide.

  • Si vous voulez obtenir la liste de tous les classements dans le jeu, appelez la méthode Leaderboards.list.

  • Si un joueur a terminé un jeu, vous pouvez envoyer son score à Scores.submit et découvrir s'il s'agit d'un nouveau record.

  • Pour afficher un classement, récupérez les données de Scores.list et présentez-les à l'utilisateur.

  • Utilisez Scores.listWindow pour trouver une variété de scores proches du record de l'utilisateur.

  • Pour obtenir plus d'informations sur le score d'un joueur dans un classement spécifique (par exemple, si le joueur figure dans la tranche supérieure de 12 % de tous les joueurs), appelez la méthode Scores.get.

  • Si vous déboguez un jeu, vous pouvez appeler Scores.reset à partir des API Management pour réinitialiser tous les scores du joueur à partir d'un classement donné.