Skip to content

[FEATURE] Rendre le refresh token stateless (PIX-24119) - #17422

Open
nlepage wants to merge 4 commits into
pix-24133-revoke-session-storagefrom
pix-24119-stateless-refresh-token
Open

[FEATURE] Rendre le refresh token stateless (PIX-24119)#17422
nlepage wants to merge 4 commits into
pix-24133-revoke-session-storagefrom
pix-24119-stateless-refresh-token

Conversation

@nlepage

@nlepage nlepage commented Sep 7, 2026

Copy link
Copy Markdown
Member

☀️ Problème

Actuellement le refresh token est stateful, ses informations sont stockées dans Redis.
On souhaite rendre le refresh token stateless.

⛱️ Proposition

Utiliser un refresh token au format JWT.

🧴 Remarques

Cette fonctionnalité est derrière le feature toggle isSessionLogoutEnabled.

🏊 Pour tester

Le feature toggle est actif sur la RA.
La durée de vie de l’access token est descendue à 1 minute sur la RA.

  • Se connecter sur Pix App.
  • Vérifier que le refresh token dans le storage du navigateur est bien un JWT.
  • Vérifier que le rafraichissement de l’access token fonctionne correctement.

Vérifier qu’il n’y a pas de régression avec le feature toggle inactif.

Vérifier qu’un refresh token créé avec le feature toggle inactif est toujours utilisable après activation du feature toggle.

@nlepage nlepage self-assigned this Sep 7, 2026
@nlepage
nlepage requested a review from a team as a code owner September 7, 2026 18:42
@pix-bot-github

pix-bot-github commented Sep 7, 2026

Copy link
Copy Markdown

@lego-technix
lego-technix self-requested a review September 8, 2026 07:49
/**
* @param {string} value
*/
static isRefreshToken(value) {

@lego-technix lego-technix Sep 8, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Serait-il possible de renommer isRefreshTokenisStatefulRefreshToken ? Il me semble que cela indiquerait mieux que cette méthode permet de différencier les 2 types de refresh tokens.

Suggested change
static isRefreshToken(value) {
static isStatefulRefreshToken(value) {

@lego-technix lego-technix Sep 8, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Serait-il possible de marquer la classe RefreshToken (et/ou son constructeur) comme @deprecated ?

import { validateEntity } from '../../../shared/domain/validators/entity-validator.js';

export class UserRefreshToken {
constructor({ userId, audience, sessionId, source }) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion : dans tout ce fichier, par considération d’organisation et de facilité de compréhension du code, veiller à ordonner comme suit les propriétés :

  1. userId (c’est le plus important)
  2. sessionId (ça va avec le userId)
  3. audience (c’est une problématique sécurité réseau, et donc sur un autre plan que userId et sessionId )
  4. source (c’est une donnée sans utilité et que nous voulons supprimer depuis longtemps)
Suggested change
constructor({ userId, audience, sessionId, source }) {
constructor({ userId, sessionId, audience, source }) {

}

static generate({ userId, source, audience, sessionId }) {
const expirationDelaySeconds = config.authentication.refreshTokenLifespanMs / 1000;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est-ce qu’on pourrait définir cette variable à la racine du module pour ne pas la déclarer et la calculer à chaque appel de la méthode ?

}

hasSameAudience(audience) {
return this.audience === audience;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je sais que ce code provient de l’ancienne classe dépréciée RefreshToken, mais serait-il possible d’en profiter pour ne pas reproduire cette yoda condition :

Suggested change
return this.audience === audience;
return audience === this.audience;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants