36 votes

Les services Google Play renvoient un jeton signé avec une clé non Google

J'ai un client Android qui reçoit un jeton d'authentification de Google Play Services, en utilisant GoogleAuthUtil.getToken(Context context, Account account, String scope) .

Il est ensuite envoyé à un serveur dorsal (Go), qui vérifie que le jeton a été signé par l'un des certificats de signature Google de https://www.googleapis.com/oauth2/v1/cert . Pour ce faire, il doit rechercher le certificat attribué au "kid" dans l'en-tête du jeton.

Dans 99% des cas, cela fonctionne parfaitement, mais il m'arrive régulièrement que le "kid" donné ne corresponde à aucun certificat Google publié, et que je ne puisse donc pas authentifier le jeton.

Edita:

J'ai mis en place un système de journalisation sur le serveur pour tenter de résoudre ce problème, et certaines relations méritent d'être signalées :

  1. Toute valeur invalide donnée kid n'est utilisé que pour un seul utilisateur. Je vois souvent plusieurs demandes sur plusieurs jours de la part d'un même utilisateur avec une invalidité donnée. kid mais uniquement de la part de cet utilisateur.
  2. Un utilisateur qui donne un kid n'utilise jamais un kid pour toute demande, ou toute autre kid pour une demande, même si elles sont espacées de plusieurs jours. Il semble que Google renouvelle ses certificats toutes les 24 heures environ.
  3. De nombreux utilisateurs se servent d'anciennes versions du client. La plupart des utilisateurs procèdent à une mise à niveau dans un délai d'un jour ou deux après la publication d'une nouvelle version, mais la majorité des utilisateurs dont les clés de certificat ne sont pas valides utilisent des versions vieilles de quelques semaines.
  4. Les demandes proviennent d'un peu partout dans le monde, à l'image de notre base d'utilisateurs.
  5. Les demandes proviennent d'un grand nombre de fois, ce qui correspond à notre base d'utilisateurs.
  6. Les demandes proviennent de toute une série d'appareils, de fabricants et de modèles.

Je pense qu'il s'agit probablement d'utilisateurs qui ont téléchargé l'APK depuis un site autre que Google Play, mais je n'ai aucun moyen de le vérifier pour l'instant.

Edit : Il y a un gestionnaire de problème pour cela, mais il semble qu'il ait été marqué comme une faible priorité. Si quelqu'un a ce problème, merci de le faire savoir sur le tracker. https://issuetracker.google.com/issues/37734997

0 votes

Vous pouvez vérifier comment votre code enregistre l'identifiant sur le serveur. Vous pouvez également consulter ce document - S'authentifier auprès d'un serveur dorsal Cela permet d'éviter d'envoyer le tokenID au serveur pour en vérifier l'intégrité. J'espère que cela vous aidera.

0 votes

@Mr.Rebot S'il s'agissait d'une erreur du client, elle devrait affecter l'ensemble du jeton, mais tout ce que je vois, c'est un jeton bien formé avec un "kid" qui ne correspond à aucune clé de certificat de signature Google publiée.

0 votes

De nombreux téléphones Android (en particulier dans les pays d'Asie de l'Est) n'ont pas de Play Store ou de Google Play Services. Est-il possible que ces utilisateurs ne reçoivent pas les jetons d'authentification appropriés ? Cela confirme votre idée que ces utilisateurs n'ont pas téléchargé l'APK à partir du Play Store.

2voto

113408 Points 788

C'est un peu tard, mais pour tous ceux qui rencontrent le même problème, je suggère de vérifier la page d'accueil du site. Installer de votre application.

L'utilisation PackageManager.getInstallerPackageName()

getInstallerPackageName (String packageName) Récupère le nom du package de l'applica de l'application qui a installé un paquet. Cela permet d'identifier l'application marché d'où provient le paquet

Si la valeur est "com.Android.vending", l'application a été installée à partir du Play Store, sinon il faut gérer les autres fournisseurs.

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