Ajouter la vérification des licences côté serveur à votre application
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Pour vérifier que l'utilisateur a acheté ou téléchargé une copie légitime de votre application sur le Google Play Store, il est préférable d'effectuer la vérification de la licence sur un serveur que vous contrôlez.
Ce guide explique en détail la procédure de vérification des licences côté serveur et présente quelques bonnes pratiques liées à cette pratique.
Présentation du processus
La figure 1 montre comment les informations sont transférées entre votre application, Google Play et votre serveur privé :
Figure 1. Flux de données entre votre application et Google Play, puis entre votre application et votre serveur privé
Votre application envoie une requête à Google Play pour déterminer si un utilisateur particulier a acheté ou téléchargé une copie légitime de votre application.
Google Play répond en envoyant un objet de données de réponse, un objet de type ResponseData, à votre application. Cet objet est une information signée indiquant si l'utilisateur a acheté ou téléchargé une copie légitime de votre application.
Votre application envoie une requête à un serveur privé que vous contrôlez, en vérifiant le contenu des données de réponse.
Le serveur répond en envoyant un état à votre application. Il indique si l'utilisateur a effectivement acheté ou téléchargé une copie légitime de votre application. Si le serveur fournit un message de confirmation, vérifiez la réponse, puis accordez à l'utilisateur l'accès aux ressources nécessitant une licence.
Étant donné que les données de réponse sont signées par Google Play, puis vérifiées sur votre serveur, il n'existe aucun moyen de modifier l'objet sur l'appareil exécutant votre application. Si votre application s'appuie sur le serveur et ne donne accès aux ressources qu'aux utilisateurs légitimes, elle est bien plus protégée contre les utilisateurs non autorisés.
Les sections suivantes incluent des points supplémentaires à prendre en compte lors de la vérification des licences côté serveur.
Protection contre les attaques par relecture
Après avoir reçu une réponse de Google Play concernant l'état de la licence de l'utilisateur, ce dernier peut copier les données de réponse et les utiliser à plusieurs reprises, ou les transmettre à d'autres utilisateurs qui pourraient alors falsifier leurs propres requêtes au serveur privé de votre application. C'est ce que l'on appelle des attaques par relecture.
Pour éviter que les utilisateurs effectuent des attaques par relecture, prenez les mesures suivantes avant d'envoyer une requête au serveur de votre application :
Vérifiez l'horodatage inclus dans les données de réponse, en vous assurant que Google Play a généré la réponse récemment.
Pour limiter le débit de votre requête de serveur, définissez un intervalle exponentiel entre les tentatives, par exemple, afin de réduire le nombre de fois que votre application tente d'envoyer les mêmes données de réponse au serveur de votre application.
Avant de vérifier le contenu des données de réponse de Google Play sur votre serveur privé, envoyez une requête initiale basée sur une authentification à votre serveur privé. Dans cette première requête, envoyez les identifiants utilisateur à votre serveur. Votre serveur doit répondre par un nonce, ou par un nombre qui ne sera utilisé qu'une seule fois. Vous pouvez ensuite inclure ce nonce dans la prochaine requête adressée à votre serveur privé, afin de demander des données de vérification de licence. Pour déterminer comment choisir une valeur correcte pour le nonce, consultez la section Générer une valeur de nonce appropriée.
Générer une valeur nonce appropriée
Suivez l'une des techniques ci-dessous pour créer une valeur nonce difficile à deviner :
Générez une valeur de hachage en fonction de l'ID de l'utilisateur.
Générez une valeur aléatoire par utilisateur. Stockez cette valeur aléatoire sur le serveur de votre application en tant qu'attribut d'un utilisateur donné.
Vérifier les données de réponse de votre serveur
Lorsque vous examinez les données de réponse envoyées par le serveur à votre application, assurez-vous que la réponse de la bibliothèque LVL n'est pas falsifiée. Pour vérifier la signature incluse dans les données de réponse du serveur d'applications, comparez-la à la clé que votre application a reçue de Google Play lors d'une étape précédente.
N'oubliez pas non plus que le bloc spécifique à la bibliothèque LVL (License Verification Library) est la seule partie signée. Par conséquent, c'est la seule partie des données de réponse de votre serveur que votre application doit approuver.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/07/27 (UTC)."],[],[],null,["# Adding Server-Side License Verification to Your App\n\nWhen verifying that the user has purchased or downloaded a legitimate copy of\nyour app from the Google Play Store, it's best to perform the license\nverification check on a server that you control.\n\nThis guide presents a step-by-step process for completing server-side license\nverification and presents some best practices related to performing this check.\n\nProcess overview\n----------------\n\nFigure 1 shows how information is transferred between your app, Google Play, and\nyour private server: \n**Figure 1.** Flow of data between your app and Google Play, then between your app and your private server\n\n1. Your app makes a request to Google Play, inquiring about whether a particular user has purchased or downloaded a legitimate copy of your app.\n2. Google Play responds by sending a *response data object* , an object of type [`ResponseData`](/google/play/licensing/licensing-reference#lvl-summary), to your app. This object is a signed piece of information that states whether the user has purchased or downloaded a legitimate copy of your app.\n3. Your app makes a request to a private server that you control, verifying the contents of the response data.\n4. The server responds by sending a status to your app, indicating whether the user has indeed purchased or downloaded a legitimate copy of your app. If the server provides a \"success\" message, [verify the\n response](#verify-app-server-response) and then grant the user access to the resources that require a license.\n\nBecause the response data is signed by Google Play, then checked on your\nserver, there's no way to modify the object on the device running your app. If\nyour app relies on the server and makes resources available only to legitimate\nusers, your app is substantially more protected against unauthorized users.\n\nThe following sections provide additional considerations to keep in mind when\nperforming server-side license verification.\n\nSafeguard against replay attacks\n--------------------------------\n\nAfter receiving a response from Google Play regarding the user's license status,\nit's possible for the user to copy the response data and use it multiple times,\nor give it to other users who could then forge their own requests to your app's\nprivate server. This sort of action is known as a *replay attack*.\n\nTo reduce the likelihood of users performing replay attacks successfully, take\nthe following measures before sending a request to your app's server:\n\n- Check the timestamp that's included in the response data, making sure that\n Google Play generated the response recently.\n\n | **Note:** You can increase the allowed difference between the response data's timestamp and the current time based on how long users should be able to interact with license-bound resources after they deactivate their license.\n- Perform rate-limiting on your server request, such as exponential backoff, to\n reduce the number of times that your app attempts to send the same response data\n to your app's server.\n\n | **Caution:** To preserve a good user experience in cases where a user interacts with your app on a variety of devices, be careful if you add rate-limiting based on number of devices.\n- Before verifying the contents of Google Play's response data on your private\n server, make an initial, authentication-based request to your private server. In\n this first request, send user credentials to your server, and have your server\n then respond with a *nonce* , or a number that is used only once. You can then\n include this nonce in your next request to your private server, asking for\n license verification data. For details on how to choose a good value for the\n nonce, see the [generate a suitable nonce value](#generate-nonce) section.\n\n | **Note:** Include a user ID field in both the nonce request and the license verification request. Your app's server can then compare the fields' values from the two requests and make sure they match.\n\n### Generate a suitable nonce value\n\nUse one of the following techniques to create a nonce value that's difficult to\nguess:\n\n- Generate a hash value based on the user's ID.\n- Generate a random value on a per-user basis. Store this random value on your app's server as part of a given user's attributes.\n\nVerify response data from your server\n-------------------------------------\n\nWhen reviewing response data that your app's server sends to your app, make sure\nthat the License Verification Library response isn't forged. Verify the\nsignature that's included in the app server's response data by comparing it\nwith the key that your app received from Google Play in a previous step.\n\nIt's also worth remembering that the block specific to the License Verification\nLibrary (LVL) is the only part that's signed. Therefore, it's the only part of\nyour app server's response data that your app should trust."]]