[Majeur] Token d'un utilisateur supprimé ou cookie illisible : 500 au lieu de 401 #109
Labels
No labels
bug
enhancement
feature
groupe/chat-data
groupe/friends-blocking
groupe/input-validation
groupe/realtime-presence
No milestone
No project
No assignees
1 participant
Notifications
Total time spent: 12 minutes 23 seconds
Due date
asventi
12 minutes 23 seconds
No due date set.
Dependencies
No dependencies set
Reference
Transcendence/backend#109
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Gravité : Majeur
Rapports QA d'origine : ADMIN-11, AUTH-12, SECURITY_UX-15
/melève une NullReferenceException pour un user supprimé ; un cookie AccessToken/RefreshToken corrompu fait planter toutes les requêtes, y compris/auth/login.Détails des rapports
[ADMIN-11] Après suppression d'un user, ses requêtes (token d'accès encore valide) répondent 500 NullReferenceException au lieu de 401 — Gravité : Majeur
GET /api/me(et tout endpoint utilisanttk.User/[Roles]) pour un user supprimé viaDELETE /api/users/{id}DELETE /users/<self>-> 200) 2. Avec le même cookie,GET /api/meSystem.NullReferenceExceptionavec stack trace. (Le cookie AccessToken reste accepté tant que le JWT n'a pas expiré, maisTokenContext.Userest null.)scripts/admin/t6_live.py) : un user connecté dans le navigateur puis supprimé par dede n'est PAS éjecté en temps réel : la page reste affichée, la navigation SPA (Calendar) continue de s'afficher,GET /api/merépond 500 (x2 dans les requêtes en échec), et ce n'est qu'au rechargement complet que l'on est renvoyé vers /login. Aucune déconnexion SignalR/aucun message. Screenshots :screens/admin_live_05_deleted_user_page.png,admin_live_06_deleted_after_nav.png,admin_live_07_deleted_after_reload.png.backend/API/Middlewares/TokenContext.cs(user introuvable ->_nextsans User) + endpoints[Authorize]qui déréférencenttk.User(ex.Users/Me/Get),Middlewares/Roles.cs:21.[AUTH-12] Un cookie token illisible ou un token valide d'un user inexistant provoque des 500 au lieu de 401 — Gravité : Mineur
GET /auth/refreshavecRefreshToken=abc-> 500SecurityTokenMalformedException(eta.b.c-> 500ArgumentException), alors que la doc de l'endpoint promet de purger les cookies sur toute erreur ;GET /meavecAccessToken= le refresh token (JWT valide, même clé/issuer) -> 500 NullReferenceException ;GET /meavec un access token signé valide dont l'id user n'existe pas (cas d'un user supprimé pendant ses 10 min de token) -> 500 NullReferenceException.RefreshTokensCommand.cs:20(ReadFirstClaimsans try/catch),TokenContextMiddleware.cs:31-36(CanReadfaux ->Removemais on continue avecReadFirstClaim) etTokenContextMiddleware.cs:40-44(user absent ->tk.Userreste null,[Authorize]laisse passer car JWT valide).[SECURITY_UX-15] Cookie `AccessToken`/`RefreshToken` illisible -> 500 (y compris sur `/auth/login`) — Gravité : Mineur
GET /api/auth/refreshavecRefreshToken=garbage;GET /api/users,POST /api/auth/login, et tout endpoint sans[Authorize]avecAccessToken=garbagecurl -i -H 'Cookie: RefreshToken=aaa.bbb.ccc' http://localhost:5173/api/auth/refresh2.curl -X POST -H 'Content-Type: application/json' -H 'Cookie: AccessToken=garbage' -d '{"login":"x","password":"y"}' http://localhost:5173/api/auth/loginArgumentException IDX12729avec stack trace). Un navigateur dont le cookie AccessToken est corrompu ne peut plus se connecter tant que le cookie n'est pas supprimé à la main (login -> 500). Sur les endpoints[Authorize], le garbage donne bien 401 (alg:none et JWT forgé -> 401, OK).backend/API/Middlewares/TokenContext.cs:27(ReadFirstClaimappelé même quandCanReadest faux, il manque unreturn/await _next),backend/API/Auth/Refresh/RefreshTokensCommand.cs:20(ReadFirstClaimnon protégé)Trouvé par une campagne de tests QA automatisés (agents Claude, Playwright) sur l'environnement de dev. Les captures citées sont locales et non jointes.