error - google oauth2 v2 auth




Pourquoi les jetons d'accès expirent-ils? (3)

Je commence à travailler avec Google API et OAuth2. Lorsque le client autorise mon application, je reçois un «jeton d'actualisation» et un «jeton d'accès» de courte durée. Maintenant, chaque fois que le jeton d'accès expire, je peux POSTER mon jeton d'actualisation à Google et ils me donneront un nouveau jeton d'accès.

Ma question est la suivante: quel est l'objectif de l'expiration du jeton d'accès? Pourquoi ne peut-il pas y avoir un jeton d'accès de longue durée au lieu du jeton d'actualisation?

En outre, le jeton d'actualisation expire-t-il?

Voir Utilisation d'OAuth 2.0 pour accéder aux API Google pour plus d'informations sur le workflow Google OAuth2.


C'est essentiellement une mesure de sécurité. Si votre application est compromise, l'attaquant n'aura accès qu'au jeton d'accès de courte durée et aucun moyen d'en générer un nouveau.

Les jetons d'actualisation expirent également, mais ils sont supposés vivre beaucoup plus longtemps que le jeton d'accès.


Ceci est très spécifique à la mise en œuvre, mais l'idée générale est de permettre aux fournisseurs d'émettre des jetons d'accès à court terme avec des jetons d'actualisation à long terme. Pourquoi?

  • De nombreux fournisseurs prennent en charge les jetons au porteur qui sont très faibles en termes de sécurité. En les rendant éphémères et nécessitant une actualisation, ils limitent le temps qu'un attaquant peut abuser d'un jeton volé.
  • Le déploiement à grande échelle ne souhaite pas effectuer une recherche dans la base de données à chaque appel d'API. À la place, ils émettent un jeton d'accès auto-codé qui peut être vérifié par déchiffrement. Cependant, cela signifie également qu'il n'y a aucun moyen de révoquer ces jetons afin qu'ils soient émis pour une courte période et doivent être actualisés.
  • Le jeton d'actualisation nécessite l'authentification du client, ce qui le rend plus fort. Contrairement aux jetons d'accès ci-dessus, il est généralement implémenté avec une recherche de base de données.

Un couple de scénarios peut aider à illustrer l'objectif des jetons d'accès et d'actualisation et les compromis d'ingénierie dans la conception d'un système oauth2 (ou tout autre système d'authentification):

Scénario d'application Web

Dans le scénario de l'application Web, vous disposez de plusieurs options:

  1. Si vous disposez de votre propre gestion de session, stockez les paramètres access_token et refresh_token par rapport à votre identifiant de session à l'état de session sur votre service d'état de session. Lorsqu'une page est demandée par l'utilisateur qui vous demande d'accéder à la ressource, utilisez access_token et si le message access_token a expiré, utilisez refresh_token pour obtenir le nouveau.

Imaginons que quelqu'un réussisse à détourner votre session. La seule chose possible est de demander vos pages.

  1. Si vous n'avez pas de gestion de session, placez access_token dans un cookie et utilisez-le comme une session. Ensuite, chaque fois que l'utilisateur demande des pages à partir de votre serveur Web, envoyez le access_token. Votre serveur d'applications peut actualiser access_token si nécessaire.

En comparant 1 et 2:

Dans 1, access_token et refresh_token voyagent uniquement sur le chemin entre le serveur d'autorisation (google dans votre cas) et votre serveur d'applications. Cela se ferait sur un canal sécurisé. Un pirate informatique pourrait pirater la session, mais il ne pourrait interagir qu'avec votre application Web. Dans 2, le pirate peut retirer access_token et former ses propres requêtes aux ressources auxquelles l'utilisateur a accordé l'accès. Même si le hacker obtient le access_token, il n'aura qu'une courte fenêtre dans laquelle il pourra accéder aux ressources.

Dans tous les cas, refresh_token et clientid / secret sont uniquement connus du serveur, ce qui rend impossible l'accès à long terme au navigateur Web.

Imaginons que vous implémentiez oauth2 et définissiez un long délai d'attente sur le jeton d'accès:

Dans 1) Il n'y a pas beaucoup de différence entre un jeton d'accès court et un jeton d'accès long car il est caché dans le serveur de l'application. Dans 2) quelqu'un pourrait obtenir le access_token dans le navigateur et l'utiliser ensuite pour accéder directement aux ressources de l'utilisateur pendant une longue période.

Scénario mobile

Sur le mobile, il y a quelques scénarios que je connais:

  1. Stockez clientid / secret sur l'appareil et demandez à l'appareil d'orchestrer l'accès aux ressources de l'utilisateur.

  2. Utilisez un serveur d'application backend pour contenir le clientid / secret et faites-le faire l'orchestration. Utilisez access_token comme type de clé de session et transmettez-le entre le client et le serveur d'applications.

En comparant 1 et 2

En 1) Une fois que vous avez clientid / secret sur l'appareil ils ne sont plus secrets. Tout le monde peut se décompiler et commencer à agir comme si c'était vous, avec la permission de l'utilisateur bien sûr. Les options access_token et refresh_token sont également en mémoire et peuvent être consultées sur un appareil compromis, ce qui signifie que quelqu'un pourrait agir comme votre application sans que l'utilisateur donne ses informations d'identification. Dans ce scénario, la longueur de access_token ne fait aucune différence sur le piratage car refresh_token est au même endroit que access_token. En 2) le clientid / secret ou le jeton d'actualisation sont compromis. Ici, la longueur de l'expiration du paramètre access_token détermine la durée pendant laquelle un pirate peut accéder aux ressources des utilisateurs, au cas où ils en prendraient possession.

Longueurs d'expiration

Ici, cela dépend de ce que vous sécurisez avec votre système d'authentification quant à la durée de votre expiration d'access_token. Si c'est quelque chose de particulièrement précieux pour l'utilisateur, il devrait être court. Quelque chose de moins précieux, ça peut être plus long.

Certaines personnes comme google n'expirent pas le refresh_token. Certains aiment le stackflow. La décision sur l'expiration est un compromis entre la facilité d'utilisation et la sécurité. La longueur du jeton d'actualisation est liée à la durée de retour de l'utilisateur, c'est-à-dire que l'actualisation est la fréquence à laquelle l'utilisateur renvoie à votre application. Si le jeton d'actualisation n'expire pas, la seule façon de les révoquer est une révocation explicite. Normalement, une connexion ne révoquerait pas.

Espérons que la poste plutôt longue est utile.