#!/usr/bin/env python3 """ Script de test d'authentification pour tous les comptes UnionFlow """ import requests import json from typing import Dict, List, Tuple class AuthTester: def __init__(self, base_url: str = "http://localhost:8180"): self.base_url = base_url self.session = requests.Session() def test_account(self, username: str, password: str, realm: str = "unionflow", client_id: str = "unionflow-mobile") -> Tuple[bool, str]: """Teste l'authentification d'un compte""" try: data = { "username": username, "password": password, "grant_type": "password", "client_id": client_id } response = self.session.post( f"{self.base_url}/realms/{realm}/protocol/openid-connect/token", data=data, headers={"Content-Type": "application/x-www-form-urlencoded"}, timeout=10 ) if response.status_code == 200: token_data = response.json() if "access_token" in token_data: return True, "Authentification réussie" else: return False, "Token manquant dans la réponse" else: error_data = response.json() if response.content else {} error_msg = error_data.get("error_description", f"HTTP {response.status_code}") return False, error_msg except requests.exceptions.RequestException as e: return False, f"Erreur de connexion: {e}" except json.JSONDecodeError: return False, "Réponse JSON invalide" except Exception as e: return False, f"Erreur inattendue: {e}" def test_all_accounts(self) -> None: """Teste tous les comptes UnionFlow""" accounts = [ ("superadmin", "SuperAdmin123!", "SUPER_ADMINISTRATEUR"), ("marie.active", "Marie123!", "MEMBRE_ACTIF"), ("jean.simple", "Jean123!", "MEMBRE_SIMPLE"), ("tech.lead", "TechLead123!", "RESPONSABLE_TECHNIQUE"), ("rh.manager", "RhManager123!", "RESPONSABLE_MEMBRES") ] print("=" * 80) print("🔍 TEST D'AUTHENTIFICATION UNIONFLOW") print("=" * 80) print() # Vérifier que Keycloak est accessible try: response = self.session.get(f"{self.base_url}", timeout=5) if response.status_code != 200: print("❌ Keycloak n'est pas accessible") return except: print("❌ Keycloak n'est pas accessible") return print("✅ Keycloak accessible") print() success_count = 0 total_count = len(accounts) for username, password, role in accounts: print(f"🧪 Test {username}...", end=" ") success, message = self.test_account(username, password) if success: print(f"✅ SUCCÈS") print(f" └─ Rôle: {role}") success_count += 1 else: print(f"❌ ÉCHEC") print(f" └─ Erreur: {message}") print() print("=" * 80) print("📊 RÉSULTAT FINAL") print("=" * 80) print() if success_count == total_count: print("🎉 PARFAIT ! Tous les comptes fonctionnent !") print(f" ✅ {success_count}/{total_count} comptes opérationnels") print() print("🚀 PRÊT POUR L'APPLICATION MOBILE :") print() print(" 📱 TESTEZ MAINTENANT SUR VOTRE SAMSUNG :") print(" 1. Ouvrez l'app UnionFlow") print(" 2. Cliquez sur 'Se connecter avec Keycloak'") print(" 3. Utilisez: marie.active / Marie123!") print(" 4. Vérifiez que l'authentification fonctionne") print() print(" 🔐 AUTRES COMPTES DISPONIBLES :") for username, password, role in accounts: print(f" • {username} / {password} ({role})") print() print("✅ ARCHITECTURE RÔLES UNIONFLOW 100% OPÉRATIONNELLE !") elif success_count > 0: print(f"⚠️ Configuration partielle ({success_count}/{total_count} comptes fonctionnent)") print(" Vous pouvez tester avec les comptes qui marchent") print(" Relancez: python setup_keycloak.py pour corriger") else: print("❌ Aucun compte ne fonctionne") print(" Vérifiez que Keycloak est configuré correctement") print(" Relancez: python setup_keycloak.py") print() print("=" * 80) def main(): """Fonction principale""" tester = AuthTester() tester.test_all_accounts() if __name__ == "__main__": main()