web-dev-qa-db-fra.com

Quand les jetons GCM expirent-ils et qu'est-ce que le InstanceID?

Étant donné que GCM continue d'être mis à jour, la plupart des ressources que j'ai recherchées semblent obsolètes ou peu claires. Fondamentalement, je suis confus quant à l'expiration des jetons et des pièces d'identité. (Pour référence, je travaille avec Android.)

D'après ce que je comprends (et corrigez-moi si je me trompe), mon serveur possède une clé API et un identifiant d'expéditeur. En utilisant l'ID de l'expéditeur, je peux demander à mon client de demander un jeton via l'ID d'instance stocké localement sur mon client. Je suis déjà un peu confus ici. Le InstanceID est attribué au moment où mon application est en ligne? Cela change-t-il jamais? Qu'en est-il lorsque l'application est mise à niveau ou est désinstallée et réinstallée (ou que l'appareil est restauré)? En appelant InstanceID.getInstance, vais-je toujours récupérer le même InstanceID, ou va-t-il finalement expirer et m'en donner un nouveau? Y a-t-il une valeur à stocker la chaîne que vous récupérez en appelant getID ()? Les documents semblent indiquer que vous récupérez réellement un nouvel InstanceID lorsque vous appelez getID (), ce qui complique encore les choses. (Pour référence, je fais référence à: https://developers.google.com/instance-id/ )

En utilisant l'ID d'instance, mon client peut demander un jeton aux serveurs GCM, qu'il envoie ensuite à mon serveur d'applications. Mon serveur d'applications stocke ce jeton et peut l'utiliser pour envoyer des messages aux serveurs GCM, qui enverront ensuite le message à l'appareil. L'appareil utilise l'instance ID stockée pour réellement recevoir ces messages, je crois. Donc, avoir une classe qui étend GcmListenerService me permettra de recevoir ces messages avec onMessageReceived? Je n'ai rien à faire de spécial (à part le définir dans le AndroidManifest)? Je n'ai pas besoin de lui dire d'utiliser le InstanceID? Il sait comme par magie?

Quand ces ID et jetons expirent-ils? Expirent-ils? Je stocke le jeton sous forme de chaîne sur le serveur, mais si à un moment donné l'une de ces dates expire, comment puis-je savoir qu'elles ont expiré? Je peux toujours générer un nouvel InstanceID et un nouveau jeton, cela semble facile, mais les anciens restent-ils actifs? Comment effacer les anciens jetons du serveur? Il semble y avoir un moyen facile de le faire avec APNS du côté iOS, où vous pouvez récupérer une liste de tous les jetons expirés et les effacer de votre base de données.

25
B. Roth

Je me suis retrouvé à poser la plupart de ces questions moi-même lors de la mise à jour de mon implémentation GCM. Après avoir joué avec elle quelques jours, voici mon point de vue sur vos questions.

D'après ce que je comprends (et corrigez-moi si je me trompe), mon serveur possède une clé API et un identifiant d'expéditeur. En utilisant l'ID de l'expéditeur, je peux demander à mon client de demander un jeton via l'ID d'instance stocké localement sur mon client.

C'est correct.

Le InstanceID est attribué au moment où mon application est en ligne?

Il semble qu'il soit attribué dès le lancement de votre application, même si l'appareil ne peut pas accéder à Internet.

Cela change-t-il jamais? Qu'en est-il lorsque l'application est mise à niveau ou est désinstallée et réinstallée (ou que l'appareil est restauré)? En appelant InstanceID.getInstance, vais-je toujours récupérer le même InstanceID, ou va-t-il finalement expirer et m'en donner un nouveau?

Selon la documentation InstanceID :

L'ID d'instance est stable mais peut devenir invalide si:

  • L'application supprime l'ID d'instance
  • L'appareil est réinitialisé aux paramètres d'usine
  • L'utilisateur désinstalle l'application
  • L'utilisateur efface les données de l'application

Si l'ID d'instance n'est plus valide, l'application peut appeler getId () pour demander un nouvel ID d'instance.

J'ai testé la désinstallation de l'application et l'effacement des données, et les résultats indiquent que tout ce qui précède est vrai.

Y a-t-il une valeur à stocker la chaîne que vous récupérez en appelant getID ()?

Il semble que l'API gère pour vous le stockage dans le stockage local de votre application.

En utilisant l'ID d'instance, mon client peut demander un jeton aux serveurs GCM, qu'il envoie ensuite à mon serveur d'applications. Mon serveur d'applications stocke ce jeton et peut l'utiliser pour envoyer des messages aux serveurs GCM, qui enverront ensuite le message à l'appareil. L'appareil utilise l'instance ID stockée pour réellement recevoir ces messages, je crois. Donc, avoir une classe qui étend GcmListenerService me permettra de recevoir ces messages avec onMessageReceived? Je n'ai rien à faire de spécial (à part le définir dans le AndroidManifest)? Je n'ai pas besoin de lui dire d'utiliser le InstanceID? Il sait comme par magie?

Pour autant que je sache, il n'y avait aucune sorte de InstanceId dans l'implémentation précédente, et il ne semble pas non plus qu'il soit explicitement utilisé dans celle-ci. Si c'est le cas, il est appelé dans GcmReceiver ou GcmListenerService .

Quand ces ID et jetons expirent-ils? Expirent-ils?

J'ai déjà abordé l'expiration des identifiants et nous pouvons en savoir plus sur l'expiration des jetons dans le Guide de mise en œuvre de InstanceID Android :

Le service ID d'instance lance des rappels périodiquement (par exemple, tous les 6 mois), demandant que votre application actualise ses jetons. Il peut également initier des rappels lorsque:

  • Il y a des problèmes de sécurité; par exemple, des problèmes de SSL ou de plate-forme.
  • Les informations sur l'appareil ne sont plus valides; par exemple, sauvegarde et restauration.
  • Le service ID d'instance est autrement affecté.

Le guide dit de sous-classer InstanceIDListenerService et de remplacer onTokenRefresh() pour gérer ces scénarios.

Je stocke le jeton sous forme de chaîne sur le serveur, mais si à un moment donné l'une de ces dates expire, comment puis-je savoir qu'elles ont expiré?

Le guide pour implémenter GCM sur votre serveur indique que le serveur GCM répondra à votre serveur avec quelques informations sur le jeton que vous avez utilisé pour essayer d'envoyer la notification Push.

Je peux toujours générer un nouvel InstanceID et un nouveau jeton, cela semble facile, mais les anciens restent-ils actifs?

Mes tests suggèrent que oui, ils le font.

Comment effacer les anciens jetons du serveur? Il semble y avoir un moyen facile de le faire avec APNS du côté iOS, où vous pouvez récupérer une liste de tous les jetons expirés et les effacer de votre base de données.

J'étudie toujours cela et je mettrai à jour si je peux trouver quelque chose.

24
pumpkinpie65

@ pumpkinpie65 et @B. Roth, voici ce que j'ai fait pour détecter les jetons invalides dans ma base de données.

il y a une option "dry run" dans GCM lors de l'envoi d'une notification à l'utilisateur/liste d'utilisateurs. Lorsque vous définissez une exécution à sec lors de l'envoi de notifications, il n'alerte pas les clients ni ne leur montre de notifications, mais renvoie une réponse sur les jetons valides (200) et ceux qui ne le sont pas.

Si vous envoyez une notification à 200 utilisateurs en utilisant l'option run-dry, alors dans le même ordre, vous obtiendrez la réponse de GCM.

6
Bold P.

Qu'est-ce que l'ID d'instance?

L'ID d'instance fournit un ID unique par instance de vos applications. Vous pouvez implémenter l'ID d'instance pour les applications Android et iOS ainsi que Chrome applications/extensions).

En plus de fournir des ID uniques pour l'authentification, l'ID d'instance peut générer des jetons de sécurité à utiliser avec d'autres services.

Principales caractéristiques

  • Générer des jetons de sécurité
  • Vérifier l'authenticité de l'application
  • Confirmer que l'appareil de l'application est actif
  • Identifiez et suivez les applications

Cycle de vie de l'ID d'instance

  1. Le service Instance ID émet un InstanceID lorsque votre application est en ligne. Le InstanceID est soutenu par une paire de clés publique/privée avec la clé privée stockée sur le périphérique local et la clé publique enregistrée avec le service ID d'instance.
  2. Votre application peut demander un nouvel InstanceID chaque fois que nécessaire en utilisant la méthode getID (). Votre application peut le stocker sur votre serveur si vous en avez un qui prend en charge votre application.
  3. Votre application peut demander des jetons au service ID d'instance selon les besoins à l'aide de la méthode getToken (), et comme InstanceID, votre application peut également stocker des jetons sur votre propre serveur. Tous les jetons émis pour votre application appartiennent à l'instanceID de l'application.
  4. Les jetons sont uniques et sécurisés, mais votre application ou le service ID d'instance peut avoir besoin de rafraîchir les jetons en cas de problème de sécurité ou lorsqu'un utilisateur désinstalle et réinstalle votre application pendant la restauration de l'appareil. Votre application doit implémenter un écouteur pour répondre aux demandes d'actualisation de jeton du service ID d'instance.

Quand l'ID d'instance devient-il invalide?

  • L'application supprime l'ID d'instance
  • L'appareil est réinitialisé aux paramètres d'usine
  • L'utilisateur désinstalle l'application
  • L'utilisateur efface les données de l'application

Si l'ID d'instance n'est plus valide, l'application peut appeler getId () pour demander un nouvel ID d'instance. Pour prouver la propriété de l'ID d'instance et pour permettre aux serveurs d'accéder aux données ou aux services associés à l'application, appelez getToken (String, String).

Quand rafraîchir les jetons?

Le service ID d'instance lance des rappels périodiquement (par exemple, tous les 6 mois), demandant que votre application actualise ses jetons. Il peut également initier des rappels lorsque:

Il y a des problèmes de sécurité; par exemple, des problèmes de SSL ou de plate-forme. Les informations sur l'appareil ne sont plus valides; par exemple, sauvegarde et restauration. Le service ID d'instance est autrement affecté.

Tout ce que vous devez savoir sur l'ID d'instance se trouve dans les liens officiels suivants:

2
Darush