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é :
- 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.