La session qui ne voulait pas se terminer
An account that should have been locked kept a valid session because the frontend auth state and the backend's view of the session disagreed with no error.
Visible seulement en s'en servant
Invisible à la relecture du code. Trouvé en étant le vrai utilisateur, sur un vrai appareil, à une vraie largeur.
A fait surface environ trois semaines après la mise en place du schéma initial, par l'usage plutôt que la relecture. Un compte qui aurait dû être verrouillé se baladait toujours dans l'application sur une session qui, selon toutes les règles, n'aurait pas dû être valide.
Je l'ai trouvé en mettant l'état d'authentification du front-end à côté des logs du back-end et en remarquant qu'ils étaient en désaccord : l'application pensait le compte déconnecté, le back-end acceptait toujours le jeton. Évident après coup — les JWT sont sans état, donc une fois que tu en signes un tu ne peux pas le reprendre, et le jeton n'a aucune idée que le compte a été verrouillé cinq minutes plus tard.
Corrigé avec un compteur token_version sur chaque utilisateur, intégré au jeton et vérifié à chaque requête. Incrémente le compteur et tout ce qui est en circulation pour cet utilisateur meurt d'un coup. Attrapé en développement, pas devant des utilisateurs. Ce que j'en ai tiré : décide comment tu tues une session avant d'écrire l'endpoint de connexion, pas après avoir découvert que tu ne peux pas.