Play Integrity pour PC vous aide à vérifier que les événements de jeu et les requêtes de serveur proviennent d'une instance authentique de Google Play Jeux pour PC sur un appareil PC authentique. En détectant les appareils potentiellement risqués et les émulateurs inconnus, le serveur backend de votre jeu peut réagir de manière appropriée pour éviter la triche, les accès non autorisés, le trafic frauduleux et les abus.
Conditions préalables
- Terminez la configuration du SDK.
- Consultez les considérations de sécurité de l'API Integrity security considerations.
- Lisez et comprenez les conditions d'utilisation et les informations sur le traitement des données de l'API Integrity.
- Dans votre console Google Cloud, créez un projet Cloud ou sélectionnez un projet Cloud existant que vous souhaitez utiliser avec Play Integrity pour PC. Accédez à API et services et activez l'API Google Play Integrity.
- Si vous prévoyez d'effectuer plus de 10 000 requêtes Play Integrity pour PC par jour, vous devez demander à augmenter votre limite quotidienne maximale.
Étape 1 : Déterminez comment utiliser Play Integrity pour PC dans votre jeu
Déterminez quand vous appellerez Play Integrity pour PC afin d'obtenir une évaluation de l'intégrité de l'environnement. Par exemple, vous pouvez demander une évaluation lorsque le jeu est ouvert, lorsqu'un joueur se connecte ou lorsqu'il rejoint un jeu multijoueur. Déterminez ensuite comment vous gérerez les différentes réponses d'intégrité. Vous pouvez par exemple :
- Collecter la réponse sans aucune mesure d'application et analyser les données en interne pour déterminer s'il s'agit d'un signal d'abus utile.
- Collecter la réponse et implémenter une logique sur votre serveur backend pour autoriser les appareils qui réussissent les évaluations d'intégrité à jouer normalement à votre jeu, tout en mettant en cause ou en refusant l'accès au trafic provenant d'environnements suspects.
- Collecter la réponse et implémenter une logique sur votre backend pour faire correspondre les joueurs sur les appareils qui réussissent les contrôles d'intégrité, tout en faisant correspondre le trafic provenant d'environnements suspects.
Étape 2 : Demandez des jetons d'intégrité dans votre jeu
Préparer Play Integrity pour PC
Préparez (ou "échauffez") Play Integrity pour PC, ce qui permet à Google Play de mettre en cache intelligemment les informations d'attestation partielle sur l'appareil afin de réduire la latence sur le chemin critique lorsque vous effectuez une requête d'évaluation de l'intégrité. Vous pouvez le faire de manière asynchrone dès l'ouverture de votre jeu afin de pouvoir effectuer des requêtes d'intégrité à la demande lorsque vous en avez besoin.
void PrepareIntegrityToken( const PrepareIntegrityTokenParams & params, PrepareIntegrityTokenContinuation continuation )
En cas de succès, la continuation sera appelée avec une PrepareIntegrityTokenResultValue contenant une RequestTokenData qui doit être utilisée pour demander un jeton d'intégrité. Ces données doivent être mises en cache en mémoire et réutilisées pendant la durée de la session de l'application pour les appels à RequestIntegrityToken.
Un appel à PrepareIntegrityToken ne doit être effectué que si votre application détermine qu'il est nécessaire de réévaluer entièrement l'évaluation de l'intégrité.
| Détails | |
|---|---|
| Paramètres | params : paramètres contenant un numéro de projet Google Cloud. continuation: rappel asynchrone pour renvoyer le fournisseur de jetons d'intégrité à. |
Un extrait de code montrant comment l'action PrepareIntegrityToken doit être appelée est fourni comme suit :
google::play::integrity::IntegrityClient client_;
google::play::integrity::PrepareIntegrityTokenResult
IntegrityInterface::PrepareIntegrityToken(int64_t cloud_project_number) {
google::play::integrity::PrepareIntegrityTokenParams params;
params.cloud_project_number = cloud_project_number;
auto promise = std::make_shared<
std::promise<google::play::integrity::PrepareIntegrityTokenResult>>();
client_.PrepareIntegrityToken(
params,
[promise](
google::play::integrity::PrepareIntegrityTokenResult result) {
promise->set_value(std::move(result));
});
return promise->get_future().get();
}
Demander un jeton d'intégrité
Les jetons d'intégrité permettent à votre jeu de vérifier que l'appareil n'a pas été altéré. Chaque fois que votre jeu effectue une requête de serveur que vous souhaitez vérifier, vous pouvez demander un jeton d'intégrité, puis l'envoyer au serveur backend de votre jeu pour qu'il le déchiffre et le valide.
Lorsque vous vérifiez une action de l'utilisateur dans votre application avec l'API Play Integrity pour PC, vous pouvez utiliser le RequestIntegrityTokenParams::request_hash champ pour limiter les attaques par falsification. Par exemple, vous pouvez vouloir communiquer le score du joueur au serveur backend de votre jeu, et votre serveur veut vérifier que ce score n'a pas été modifié par un serveur proxy. Play Integrity pour PC peut renvoyer la valeur que vous avez définie dans ce champ, dans la réponse d'intégrité signée. Sans le champ requestHash, le jeton d'intégrité ne sera lié qu'à l'appareil, et non à la requête spécifique, ce qui n'exclut pas le risque d'attaque.
void RequestIntegrityToken( const RequestIntegrityTokenParams & params, RequestIntegrityTokenContinuation continuation )
Pour limiter le risque d'attaque, lorsque vous demandez une évaluation de l'intégrité, procédez comme suit :
- Calculez un récapitulatif de tous les paramètres de requête pertinents (par exemple, SHA256 d'une sérialisation de requête stable) à partir de l'action de l'utilisateur ou de la requête de serveur en cours.
- Définissez le champ RequestIntegrityTokenParams::request_hash sur le récapitulatif.
| Détails | |
|---|---|
| Paramètres | params : paramètres contenant le hachage de requête RequestTokenData et de vérification d’intégrité préparé. continuation: rappel asynchrone pour renvoyer les données à. |
Un extrait de code montrant comment l'action RequestIntegrityToken peut être appelée est fourni comme suit :
absl::StatusOr<google::play::integrity::RequestIntegrityTokenResult>
IntegrityInterface::RequestIntegrityToken(
const google::play::integrity::PrepareIntegrityTokenResult&
prepare_integrity_token_result,
const std::string& request_hash) {
// Check if the prepare_integrity_token_result is OK
if (!prepare_integrity_token_result.ok()) {
return absl::FailedPreconditionError(
absl::StrCat("PrepareIntegrityTokenResult is not OK. Error code: ",
prepare_integrity_token_result.error_code));
}
google::play::integrity::RequestIntegrityTokenParams params{
.request_token_data =
prepare_integrity_token_result.request_token_data,
.request_hash = request_hash};
auto promise = std::make_shared<std::promise<
google::play::integrity::RequestIntegrityTokenResult>>();
client_.RequestIntegrityToken(
params,
[promise](google::play::integrity::RequestIntegrityTokenResult result) {
promise->set_value(std::move(result));
});
return promise->get_future().get();
}
Étape 3 : Déchiffrez et validez ensuite les jetons d'intégrité sur le serveur backend de votre jeu
Déchiffrer un jeton d'intégrité
Une fois que vous avez demandé l'évaluation de l'intégrité, l'API Play Integrity fournit un jeton de réponse chiffré. Pour obtenir les évaluations de l'intégrité de l'appareil, vous devez déchiffrer le jeton d'intégrité sur les serveurs de Google :
- Créez un compte de service dans le projet Google Cloud associé à votre application.
Sur le serveur de votre application, récupérez le jeton d'accès à partir des identifiants de votre compte de service à l'aide du champ d'application playintegrity, puis exécutez la requête suivante :
playintegrity.googleapis.com/v1/<var>PACKAGE_NAME</var>:decodePcIntegrityToken -d \ '{ "integrity_token": "<var>INTEGRITY_TOKEN</var>" }'Lisez la réponse JSON.
La charge utile résultante est un jeton en texte brut contenant des évaluations et des détails sur l'intégrité, ainsi que des informations fournies par le développeur. Voici à quoi ressemble un jeton d'intégrité déchiffré :
{
"requestDetails": {
"requestPackageName": "com.your.package.name",
"requestTime": "2025-08-29T13:10:37.285Z",
"requestHash": "your_request_hash_string"
},
"deviceIntegrity": {
"deviceRecognitionVerdict": [
"MEETS_PC_INTEGRITY"
]
},
"accountDetails": {
"appLicensingVerdict": "LICENSED"
}
}
Valider le jeton d'intégrité
Le champ requestDetails du jeton d'intégrité décodé contient des informations sur la requête, y compris les informations fournies par le développeur dans requestHash.
Les champs requestHash et packageName doivent correspondre à ceux de la requête d'origine. Par conséquent, vérifiez la partie requestDetails de la charge utile JSON en vous assurant que requestPackageName et requestHash correspondent à ce qui a été envoyé dans la requête d'origine, comme dans l'extrait de code suivant :
const auto& request_details = json_payload["requestDetails"];
if (request_details.value("requestPackageName", "") != <YOUR_PACKAGE_NAME>) {
// Don't trust the verdicts.
}
// Check for the existence of the request_hash.
// If you set a request hash in the request and it's not present, you shouldn't
// trust the verdicts.
if (!request_details.contains("requestHash")) {
// Don't trust the verdicts.
}
// The requestHash from request_details needs to match the request hash your
// app provided.
if (request_details.value("requestHash", "") != <PROVIDED_REQUEST_HASH>) {
// Don't trust the verdicts.
}
// You can read the rest of payload's fields.
Étape 4 : Déterminez l'action à entreprendre en fonction de l'évaluation de l'intégrité
Le champ deviceIntegrity peut contenir une seule valeur, deviceRecognitionVerdict. Vous pouvez utiliser cette valeur pour déterminer si votre jeu s'exécute ou non sur un PC qui réussit les contrôles d'intégrité Play (réponse MEETS_PC_INTEGRITY). Le champ accountDetails contient une seule valeur, appLicensingVerdict. Vous pouvez utiliser cette valeur pour déterminer si l'utilisateur a obtenu une licence de Play. Le serveur backend de votre jeu peut collecter ces informations et les utiliser pour déterminer l'action à entreprendre par votre jeu, par exemple autoriser un événement de jeu à se poursuivre ou refuser l'accès au trafic risqué.
"deviceIntegrity": {
"deviceRecognitionVerdict": ["MEETS_PC_INTEGRITY"]
}
"accountDetails": {
"appLicensingVerdict": "LICENSED"
}
Évaluations de l'intégrité de l'appareil
deviceRecognitionVerdict peut avoir les valeurs suivantes :
MEETS_PC_INTEGRITY- Le jeu s'exécute dans un environnement PC authentique, où aucune altération sur l'appareil n'a été détectée.
- Vide (valeur vide)
- Le jeu s'exécute sur un appareil présentant des signes d'attaque (hook d'API, par exemple) ou un piratage du système (appareil exécutant une version altérée des services Google Desktop, par exemple), ou il n'est pas exécuté sur un appareil physique (un émulateur n'ayant pas réussi les contrôles d'intégrité de Google Play, par exemple).
Évaluations des détails du compte
appLicensingVerdict peut avoir les valeurs suivantes :
LICENSED- L'utilisateur est autorisé à accéder à l'application. En d'autres termes, il a installé ou mis à jour votre application depuis Google Play sur son appareil.
UNLICENSED- L'utilisateur n'est pas autorisé à accéder à l'application. C'est par exemple le cas s'il télécharge votre application indépendamment ou sans passer par Google Play.
UNEVALUATED- Les détails concernant la licence n'ont pas été examinés, car une condition requise n'a pas été respectée.
Cela peut se produire pour plusieurs raisons, y compris les suivantes :
- L'appareil n'est pas suffisamment fiable.
- La version de votre application installée sur l'appareil est inconnue de Google Play.
- L'utilisateur n'est pas connecté à Google Play.
Étape 5 : Gérer les codes d'erreur
Si votre jeu effectue une requête Play Integrity pour PC et que l'appel échoue, il reçoit un code d'erreur. Ces erreurs peuvent se produire pour diverses raisons, telles que des problèmes environnementaux (mauvaise connexion réseau, par exemple), des problèmes liés à l'intégration de votre API, ou des activités malveillantes et des attaques actives.
Codes d'erreur avec possibilité de nouvelles tentatives
La cause de ces erreurs est parfois due à des conditions temporaires. Vous devez donc relancer l'appel avec une stratégie d'intervalle exponentiel entre les tentatives.
| IntegrityError | Description de l'erreur | Code d'erreur |
|---|---|---|
kNetworkError |
Problème de connectivité réseau sur l'appareil. | 5 |
kTooManyRequests |
Trop de requêtes effectuées depuis l'appareil. | 6 |
kClientTransientError |
Problème temporaire avec le client. | 7 |
Pour plus de recommandations sur les stratégies de nouvelles tentatives , cliquez ici.
Codes d'erreur sans possibilité de nouvelles tentatives
Dans ces cas, il est peu probable que les nouvelles tentatives automatiques permettent de remédier à la situation. Toutefois, une nouvelle tentative manuelle peut être utile si l'utilisateur résout la condition à l'origine du problème.
| IntegrityError | Description de l'erreur | Code d'erreur | Action recommandée |
|---|---|---|---|
kError |
Erreur fatale lors de l'action du SDK. | 1 | Vérifiez l'implémentation de votre API avant de réessayer. |
kCloudProjectNumberIsInvalid |
Le numéro de projet Cloud n'est pas valide. | 2 | Vérifiez que votre numéro de projet Cloud est correctement configuré dans Google Cloud Console et que les requêtes sont effectuées avec le bon numéro de projet Cloud. |
kRequestHashTooLong |
Le hachage de requête est trop long. | 3 | Les hachages de requête générés sont trop longs. Assurez-vous qu'ils contiennent moins de 500 caractères. |
kNoValidPreparedTokenFound |
Aucun jeton préparé n'est disponible avant d'effectuer la requête de jeton. | 4 | Appelez l'action [PrepareIntegrityToken][prepare-token] avant d'effectuer l'appel [RequestIntegrityToken][request-integrity-token]. |
kSdkRuntimeUpdateRequired |
Une mise à jour est nécessaire pour le SDK Play for Native. | 8 | Assurez-vous que le client des services Google Play sur l'appareil est à jour et que vous utilisez la dernière version du SDK Play for Native PC. |
Tester différentes réponses de l'API Play Integrity dans votre application
Vous pouvez créer des tests pour évaluer l'interaction de l'API Play Integrity avec votre application.
Configurez un groupe Google (ou autant que vous le souhaitez) avec les adresses e-mail des utilisateurs. Vous pouvez sélectionner les évaluations d'intégrité ou le code d'erreur que ces utilisateurs doivent recevoir dans votre application à partir des serveurs de Google Play. Cela vous permet de tester la réaction de votre application à toutes les réponses et erreurs possibles.
Créez un ticket ici et indiquez quel groupe Google recevra quelle réponse d'API. Chaque groupe est configuré pour recevoir l'une des options suivantes :
Si l'évaluation de l'intégrité de l'appareil échoue, l'évaluation de la licence renvoie toujours UNEVALUATED.Évaluation de licence réussie Évaluation de licence échouée Évaluation de licence impossible Intégrité de l'appareil réussie ALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_LICENSEDALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_UNLICENSEDALLOWLIST_CONFIG_MEETS_PC_INTEGRITY_LICENSING_UNEVALUATEDIntégrité de l'appareil échouée N/A N/A ALLOWLIST_CONFIG_NO_PC_INTEGRITY_LICENSING_UNEVALUATEDVous recevrez une notification une fois la requête traitée et les utilisateurs testeurs ajoutés à la liste d'autorisation pour recevoir les évaluations d'intégrité prédéfinies à des fins de test.