32 votes

Que faut-il utiliser comme charge utile du développeur dans les API de facturation In-App de Google ?

El cours de formation pour la vente de produits in-app dans Android suggère d'utiliser une charge utile lors d'une demande d'achat :

Le cinquième argument contient une chaîne "developer payload" que vous pouvez utiliser pour envoyer des informations supplémentaires sur une commande (il peut s'agir d'une chaîne vide). En général, cette chaîne est utilisée pour transmettre un jeton de chaîne qui identifie de manière unique cette demande d'achat. Si vous spécifiez une valeur de chaîne, Google Play renvoie cette chaîne avec la réponse d'achat. Par la suite, lorsque vous effectuez des recherches sur cet achat, Google Play renvoie cette chaîne avec les détails de l'achat.

Recommandation de sécurité : Il est bon de transmettre une chaîne qui aide votre application à identifier l'utilisateur qui a effectué l'achat, afin de pouvoir vérifier ultérieurement qu'il s'agit d'un achat légitime effectué par cet utilisateur. Pour les articles consommables, vous pouvez utiliser une chaîne générée de manière aléatoire, mais pour les articles non consommables, vous devez utiliser une chaîne qui identifie l'utilisateur de manière unique.

El Mise en œuvre de la page d'achat de l'IAB a une recommandation similaire, avec la suggestion supplémentaire que la valeur de la charge utile devrait être vérifiée sur votre propre serveur sécurisé :

Recommandation de sécurité : Lorsque vous envoyez une demande d'achat, créez un jeton de type String qui identifie de manière unique cette demande d'achat et incluez ce jeton dans le developerPayload.Vous pouvez utiliser une chaîne générée de manière aléatoire comme jeton. Lorsque vous recevez la réponse d'achat de Google Play, assurez-vous de vérifier la signature des données renvoyées, l'orderId et la chaîne developerPayload. Pour plus de sécurité, vous devriez effectuer la vérification sur votre propre serveur sécurisé. Assurez-vous que l'orderId est une valeur unique que vous n'avez pas encore traitée et que le developerPayload String correspond au jeton que vous avez envoyé précédemment avec la demande d'achat.

En regardant le code source de l'application Trivial Drive que Google utilise pour faire la démonstration de l'API, je trouve cet avertissement :

* WARNING: Locally generating a random string when starting a purchase and
* verifying it here might seem like a good approach, but this will fail in the
* case where the user purchases an item on one device and then uses your app on
* a different device, because on the other device you will not have access to the
* random string you originally generated.
*
* So a good developer payload has these characteristics:
*
* 1. If two different users purchase an item, the payload is different between them,
*    so that one user's purchase can't be replayed to another user.
*
* 2. The payload must be such that you can verify it even when the app wasn't the
*    one who initiated the purchase flow (so that items purchased by the user on
*    one device work on other devices owned by the user).
*
* Using your own server to store and verify developer payloads across app
* installations is recommended.

D'après tous ces messages, il semble que ce soit une mauvaise idée d'utiliser un nombre aléatoire ou une chaîne de caractères pour la charge utile. De même, après avoir lu le dernier avertissement, il semble que ce soit une mauvaise idée de passer l'ID de l'appareil comme charge utile, car il sera différent pour le même utilisateur sur différents appareils. Que faut-il donc utiliser comme charge utile pour le développeur ?

Mon application fournit une fonctionnalité locale à laquelle l'utilisateur peut accéder sans avoir à se connecter à un quelconque service. Il n'y a donc pas de concept d'"utilisateur" et il n'y a pas non plus de composant côté serveur. La demande d'achat in-app porte sur une mise à niveau qui supprime les publicités de l'application. Est-il judicieux pour une application de ce type d'utiliser la fonction de charge utile, ou est-il préférable d'utiliser une chaîne vide et de la laisser exposée aux attaques par rejeu ?

15voto

Jay Soyer Points 2136

Ma connaissance des achats InApp provient de l'ancienne bibliothèque v2. Je n'ai pas travaillé avec la toute dernière v3, mais j'espère pouvoir encore vous aider.

Oui, l'utilisation de la charge utile du développeur en tant que fonction de sécurité supplémentaire sera certainement utile, mais la question de savoir si vous devez le faire ou non est probablement plus subjective qu'un dilemme objectif. Dans mon cas, mon client avait déjà un serveur dans le mix puisque les clients doivent télécharger 200mb de fichiers suite à un achat inapp. Nous avons utilisé la charge utile du développeur pour stocker des informations sur le fichier dont le téléchargement est autorisé. Cette information était essentielle pour indiquer à l'application comment traiter les fichiers téléchargés.

Nous avons encore fourni une sécurité supplémentaire en remplaçant l'adresse locale de l'utilisateur. verifyPurchase() avec un appel au serveur. Par exemple, en fournissant notre propre nonce à vérifier. Faire cela localement n'est pas très sûr.

Pour ce qui est de votre situation, je dirais que c'est une question de risque par rapport au coût. Quel est le risque que votre application soit piratée et que les clients évitent les achats par rapport au coût de la mise en place d'une sécurité supplémentaire ? Si votre application est téléchargée plus de 100 000 fois, le risque est assez élevé. Si elle est téléchargée plus d'un million de fois, alors le risque est élevé. Si elle n'est téléchargée que quelques milliers de fois, alors le piratage négligera probablement votre application. Si vous optez pour une sécurité accrue, vous devez mettre en place un serveur et le faire fonctionner, puis ajouter tout le code et le protocole requis pour l'application et le serveur. Tout cela demandera du temps et de l'argent. Surtout en payant pour un serveur pendant la durée de vie de votre application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X