Files
unionflow-mobile-apps/docs/corrections-401-token-manquant.md
dahoud d094d6db9c Initial commit: unionflow-mobile-apps
Application Flutter complète (sans build artifacts).

Signed-off-by: lions dev Team
2026-03-15 16:30:08 +00:00

3.2 KiB
Raw Blame History

Corrections structurées : 401 et token manquant sur les requêtes API

1. Diagnostic (symptômes observés)

  • Logs : DIO: Aucun token pour /api/membres, /api/cotisations/mes-cotisations/en-attente, /api/adhesions, /api/notifications/membre/...
  • Effet : Toutes les requêtes API (membres, cotisations, adhésions, notifications) reçoivent 401 Unauthorized.
  • Constat : Lutilisateur est bien authentifié (log « Token rafraîchi avec succès », « Utilisateur authentifié: Membre MUKEFI »), mais le client HTTP nenvoie jamais le Bearer token.

2. Cause racine

Deux instances différentes de FlutterSecureStorage sont utilisées :

Composant Configuration stockage
KeycloakAuthService FlutterSecureStorage(aOptions: AndroidOptions(encryptedSharedPreferences: true), iOptions: IOSOptions(...))
DioClient FlutterSecureStorage() (défaut)

Sur Android, une configuration avec encryptedSharedPreferences: true et la configuration par défaut ne partagent pas le même espace de stockage. Les tokens écrits par Keycloak après login/refresh sont donc invisibles pour lintercepteur Dio, qui lit un stockage vide → « Aucun token ».

3. Correction appliquée

3.1 Unifier la configuration du stockage (DioClient)

Fichier : lib/core/network/dio_client.dart

  • Utiliser la même configuration que KeycloakAuthService pour FlutterSecureStorage :
    • Android : AndroidOptions(encryptedSharedPreferences: true)
    • iOS : IOSOptions(accessibility: KeychainAccessibility.first_unlock_this_device)

Ainsi, lecture et écriture des clés keycloak_access_token, keycloak_refresh_token, etc. se font dans le même stockage que celui utilisé par lauth.

3.2 Vérifications connexes (déjà en place)

  • Clés : DioClient lit keycloak_access_token puis keycloak_webview_access_token ; KeycloakAuthService écrit bien dans keycloak_access_token (flux password) et dans le refresh Dio.
  • Log diagnostic : Le log « DIO: Auth token présent / Aucun token pour … » reste utile pour vérifier que le token est bien lu après correction.

4. Résumé des fichiers modifiés

Fichier Modification
lib/core/network/dio_client.dart Utiliser un FlutterSecureStorage avec AndroidOptions(encryptedSharedPreferences: true) et IOSOptions(accessibility: KeychainAccessibility.first_unlock_this_device) (aligné sur KeycloakAuthService).
lib/core/network/api_client.dart Idem : lire le token depuis le même type de stockage pour les modules DRY (Feed, Explore, etc.).

5. Après correction

  • Redémarrer lapp (full restart), se reconnecter si besoin.
  • Ouvrir les écrans : Membres, Cotisations, Adhésions, Notifications.
  • Dans les logs : DIO: Auth token présent pour /api/... et plus de 401 sur ces endpoints (sous réserve que le backend accepte le JWT).

6. Évolution possible

  • Centraliser la création du FlutterSecureStorage « auth » dans un seul module (ex. lib/core/storage/ ou config partagée) et linjecter / lutiliser à la fois dans KeycloakAuthService et DioClient pour éviter toute divergence future.