pix icon indicating copy to clipboard operation
pix copied to clipboard

[TECH] Renouveler les refresh tokens

Open nlepage opened this issue 2 years ago • 2 comments

:unicorn: Problème

Le même refresh token est utilisé durant toute la durée de login de l'utilisateur.

Si un attaquant subtilise un refresh token en court de validité, il peut obtenir des access tokens au nom de l'utilisateur et usurper son identité sur Pix.

:robot: Solution

Afin de limiter les possibilités d'attaque en cas de subtilisation de refresh token, on met en place le renouvellement de refresh token :

  • à chaque fois qu'un refresh token est utilisé pour obtenir un nouvel access token :
    • le refresh token est invalidé
    • un nouveau refresh token est renvoyé
  • en cas de tentative d'utilisation douteuse d'un refresh token, le refresh token est invalidé

Tokens enfants

Afin de mettre en place le renouvellement de refresh token sans modifier la durée de vie de la session utilisateur, on met en place un système de tokens enfants.

L'ancien refresh token continue d'exister comme token parent, c'est lui qui porte la durée de vie de la session utilisateur (en s'appuyant sur un TTL dans le cache).

Le refresh token renvoyé au client est un token enfant du token parent.

À un instant T, le token parent ne possède qu'un et un seul token enfant valide.

Le token enfant est à usage unique, dès qu'il est utilisé, il est remplacé par un nouveau token enfant.

Activation / désactivation du renouvellement

Introduction d'une nouvelle variable d'environnement REFRESH_TOKEN_ROTATION_ENABLED pour activer ou désactiver le renouvellement de refresh token.

Il est prévu de pouvoir activer ou désactiver le renouvellement de refresh token de manière transparente.

Activation :

  1. Un client demande un nouvel access token en utilisant un "ancien refresh token"
  2. L'ancien refresh token devient un token parent, on lui créé un token enfant
  3. On renvoie un nouvel access token et le refresh token enfant au client

Désactivation :

  1. Un client demande un nouvel access token en utilisant un refresh token enfant
  2. On invalide le token enfant, mais on n'en créé pas un nouveau
  3. On renvoie un nouvel access token et le refresh token parent au client

:rainbow: Remarques

N/A

:100: Pour tester

La durée de vie des access tokens sur la RA est intentionnellement réglé à 30 secondes.

Pour activer ou désactiver le renouvellement de refresh token :

  1. Changer la valeur de REFRESH_TOKEN_ROTATION_ENABLED dans l'environnement de la RA
  2. Redémarrer la RA

Avec le renouvellement de refresh token désactivé

Vérifier qu'il n'y a pas de régression.

Avec le renouvellement de refresh token activé

Vérifier qu'un nouveau refresh token est renvoyé à chaque fois qu'on renouvelle l'access token.

Vérifier qu'il n'est pas possible d'obtenir un access token en réutilisant un refresh token déjà utilisé.

Activation / Désactivation

Vérifier qu'il est possible d'activer et désactiver le renouvellement sans que cela interrompe la session utilisateur.

nlepage avatar Jun 22 '22 14:06 nlepage

I'm deploying this PR to these urls:

  • App (.fr): https://app-pr4563.review.pix.fr
  • App (.org): https://app-pr4563.review.pix.org
  • Orga: https://orga-pr4563.review.pix.fr
  • Certif: https://certif-pr4563.review.pix.fr
  • Admin: https://admin-pr4563.review.pix.fr
  • API: https://api-pr4563.review.pix.fr/api/

Please check it out!

pix-service avatar Jun 22 '22 14:06 pix-service

Cette PR n'est pas seulement tech, il faudrait aussi en parler aux PO : ça va changer le comportement de la durée des sessions...

Anne-Gaelle-S avatar Sep 12 '22 09:09 Anne-Gaelle-S

Clos pour cause d'inactivité

octo-topi avatar Nov 09 '22 11:11 octo-topi