web-dev-qa-db-fra.com

Comment savoir si le jeton OAuth a expiré?

Mon application mobile iOS utilise des services implémentés avec le protocole OAuth2.0. Le jeton d'accès OAuth est accompagné d'un jeton d'actualisation et d'un expires_in champ. J'ai enregistré le jeton d'actualisation et le délai d'expiration du jeton dans mon application, mais je ne sais pas quand les utiliser.

  • Alors, quelle est la meilleure pratique habituelle d'utiliser ce expires_in?
  • Comment puis-je identifier que mon jeton d'accès a expiré?
  • Existe-t-il un format d'erreur de service Web commun indiquant que mon jeton d'accès a expiré?
31
XiOS

Voici des informations sur OAuth 2.0 actualisation du jeton.

Expire dans la définition

Le standard OAuth 2.0, RFC 6749 , définit le champ expires_in Comme le nombre de secondes à expiration:

expires_in: RECOMMANDÉ. La durée de vie en secondes du jeton d'accès. Par exemple, la valeur "3600" indique que le jeton d'accès expirera dans une heure à partir du moment où la réponse a été générée. S'il est omis, le serveur d'autorisation DEVRAIT fournir le délai d'expiration par d'autres moyens ou documenter la valeur par défaut.

Gestion de l'actualisation des jetons: méthode 1

Après avoir reçu une valeur access_token, expires_in, refresh_token, Etc. valide, etc., les clients peuvent traiter cela en stockant une heure d'expiration et en la vérifiant à chaque demande. Cela peut être fait en utilisant les étapes suivantes:

  1. convertir expires_in en un délai d'expiration (Epoch, date/heure RFC-3339/ISO-8601, etc.)
  2. enregistrer le temps d'expiration
  3. à chaque demande de ressource, vérifiez l'heure actuelle par rapport à l'heure d'expiration et effectuez une demande d'actualisation de jeton avant la demande de ressource si le access_token a expiré

Un exemple d'implémentation est la bibliothèque Go oauth2 Qui convertit convertit la valeur expires_in En une date-heure RFC 3339 dans le Token propriété expiry . expiry n'est pas défini par la norme OAuth 2.0 mais est utile ici.

Lors de la vérification de l'heure, assurez-vous que vous êtes en même temps, par exemple, en utilisant le même fuseau horaire en convertissant toutes les heures en fuseau horaire ou UTC.

En plus de recevoir un nouveau access_token, Vous pouvez recevoir un nouveau refresh_token Avec un délai d'expiration dans le futur. Si vous recevez cela, vous devez stocker le nouveau refresh_token Pour prolonger la durée de votre session.

Gestion de l'actualisation des jetons: méthode 2

Une autre méthode de gestion de l'actualisation du jeton consiste à actualiser manuellement après avoir reçu une erreur de jeton non valide. Cela peut être fait avec l'approche précédente ou par lui-même.

Si vous essayez d'utiliser un access_token Expiré et que vous obtenez une erreur de jeton non valide, vous devez effectuer une actualisation du jeton (si votre jeton d'actualisation est toujours valide). Étant donné que différents services peuvent utiliser différents codes d'erreur pour les jetons expirés, vous pouvez soit garder une trace du code pour chaque service, soit un moyen simple d'actualiser les jetons entre les services consiste à simplement essayer une seule actualisation en cas d'erreur 4xx.

Erreurs de jeton d'accès non valides

Voici quelques codes d'erreur des services populaires:

  1. Facebook: Erreur 467 Jeton d'accès non valide - Le jeton d'accès a expiré, a été révoqué ou n'est pas valide - Gérez les jetons d'accès expirés.
  2. LinkedIn: erreur 401 non autorisé .
  3. Paypal: Erreur 401 non autorisé .

Actualisation de l'expiration du jeton

Si votre refresh_token A également expiré, vous devrez recommencer le processus d'autorisation.

La spécification OAuth 2. ne définit pas l'expiration du jeton d'actualisation ni comment la gérer, cependant, un certain nombre d'API renverra une propriété refresh_token_expires_in Lorsque le jeton d'actualisation expirera. Différentes API gèrent différemment l'expiration du jeton d'actualisation, il est donc important d'examiner les documents par API, mais généralement vous pouvez recevoir un nouveau jeton d'actualisation lorsque vous actualisez votre jeton d'accès. L'expiration doit être gérée de la même manière, par exemple en convertissant refresh_token_expires_in En une valeur date-heure RFC 3339 refresh_token_expiry.

Quelques exemples incluent LinkedIn , eBay et RingCentral . Dans l'API LinkedIn, lorsque vous actualisez les jetons d'accès, vous recevrez un jeton d'actualisation avec une propriété refresh_token_expires_in Décroissante ciblant le délai d'expiration du jeton d'actualisation d'origine jusqu'à ce que vous deviez vous authentifier à nouveau. L'API RingCentral renverra les jetons d'actualisation avec un temps statique afin que l'utilisateur n'ait pas à authentifier à nouveau si l'actualisation des jetons et les mises à jour des jetons d'actualisation sont effectuées de manière cohérente.

60
Grokify

Recommande la méthode 2 ci-dessus car un 401 peut se produire pour plusieurs raisons telles que le renouvellement d'un certificat de signature de jeton ou des différences d'horloge:

  • Recherchez un 401 après chaque demande d'API
  • Obtenez un nouveau jeton - une seule fois
  • Réessayez la demande d'API - une seule fois

J'ai implémenté beaucoup de clients OAuth réussis et j'ai toujours utilisé cette technique - et évité de lire le champ expires_in dans mon code côté client

0
Gary Archer