#!/bin/bash # ============================================================================= # SCRIPT DE VÉRIFICATION CONFIGURATION UNIONFLOW KEYCLOAK # ============================================================================= # # Ce script vérifie que la configuration des rôles UnionFlow est correcte : # - Vérification de l'existence des rôles # - Test d'authentification pour chaque compte # - Vérification des attributs et permissions # - Génération d'un rapport de statut # # Usage : ./verify-unionflow-keycloak.sh # ============================================================================= set -e # Configuration KEYCLOAK_URL="http://192.168.1.145:8180" REALM="unionflow" ADMIN_USER="admin" ADMIN_PASSWORD="admin" CLIENT_ID="unionflow-mobile" # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } # Obtenir le token d'administration get_admin_token() { log_info "Obtention du token d'administration..." local response=$(curl -s -X POST \ "${KEYCLOAK_URL}/realms/master/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=${ADMIN_USER}" \ -d "password=${ADMIN_PASSWORD}" \ -d "grant_type=password" \ -d "client_id=admin-cli") ADMIN_TOKEN=$(echo "$response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4) if [ -n "$ADMIN_TOKEN" ]; then log_success "Token d'administration obtenu" else log_error "Impossible d'obtenir le token d'administration" exit 1 fi } # Vérifier l'existence d'un rôle check_role() { local role_name="$1" local expected_level="$2" local response=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/roles/${role_name}" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json") if echo "$response" | grep -q '"name"'; then local level=$(echo "$response" | grep -o '"level":\["[^"]*' | cut -d'"' -f4) if [ "$level" = "$expected_level" ]; then log_success "✓ Rôle $role_name (niveau $level)" return 0 else log_warning "⚠ Rôle $role_name existe mais niveau incorrect: $level (attendu: $expected_level)" return 1 fi else log_error "✗ Rôle $role_name manquant" return 1 fi } # Tester l'authentification d'un utilisateur test_user_auth() { local username="$1" local password="$2" local expected_role="$3" log_info "Test authentification: $username" local auth_response=$(curl -s -X POST \ "${KEYCLOAK_URL}/realms/${REALM}/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=${username}" \ -d "password=${password}" \ -d "grant_type=password" \ -d "client_id=${CLIENT_ID}") if echo "$auth_response" | grep -q "access_token"; then # Décoder le token pour vérifier les rôles local access_token=$(echo "$auth_response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4) # Obtenir les informations utilisateur local user_info=$(curl -s -X GET \ "${KEYCLOAK_URL}/realms/${REALM}/protocol/openid-connect/userinfo" \ -H "Authorization: Bearer ${access_token}") if echo "$user_info" | grep -q "email"; then local email=$(echo "$user_info" | grep -o '"email":"[^"]*' | cut -d'"' -f4) log_success "✓ $username ($email) - Authentification réussie" # Vérifier les rôles via l'API admin local user_id=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/users?username=${username}" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json" | \ grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4) if [ -n "$user_id" ]; then local user_roles=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/users/${user_id}/role-mappings/realm" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json") if echo "$user_roles" | grep -q "\"name\":\"$expected_role\""; then log_success " → Rôle $expected_role correctement assigné" return 0 else log_warning " → Rôle $expected_role non trouvé dans les assignations" return 1 fi fi else log_error "✗ $username - Impossible d'obtenir les informations utilisateur" return 1 fi else log_error "✗ $username - Échec de l'authentification" echo "Réponse: $auth_response" return 1 fi } # Générer un rapport de statut generate_status_report() { echo "" echo "=============================================================================" echo "📊 RAPPORT DE STATUT CONFIGURATION UNIONFLOW" echo "=============================================================================" echo "" local total_roles=8 local total_users=8 local roles_ok=0 local users_ok=0 # Vérification des rôles echo "🔐 VÉRIFICATION DES RÔLES :" echo "" declare -A roles_levels=( ["SUPER_ADMINISTRATEUR"]="100" ["ADMINISTRATEUR_ORGANISATION"]="85" ["RESPONSABLE_TECHNIQUE"]="80" ["RESPONSABLE_FINANCIER"]="75" ["RESPONSABLE_MEMBRES"]="70" ["MEMBRE_ACTIF"]="50" ["MEMBRE_SIMPLE"]="30" ["VISITEUR"]="0" ) for role in "${!roles_levels[@]}"; do if check_role "$role" "${roles_levels[$role]}"; then ((roles_ok++)) fi done echo "" echo "👥 VÉRIFICATION DES COMPTES DE TEST :" echo "" declare -A test_accounts=( ["superadmin"]="SuperAdmin123!:SUPER_ADMINISTRATEUR" ["admin.org"]="AdminOrg123!:ADMINISTRATEUR_ORGANISATION" ["tech.lead"]="TechLead123!:RESPONSABLE_TECHNIQUE" ["tresorier"]="Tresorier123!:RESPONSABLE_FINANCIER" ["rh.manager"]="RhManager123!:RESPONSABLE_MEMBRES" ["marie.active"]="Marie123!:MEMBRE_ACTIF" ["jean.simple"]="Jean123!:MEMBRE_SIMPLE" ["visiteur"]="Visiteur123!:VISITEUR" ) for username in "${!test_accounts[@]}"; do IFS=':' read -r password expected_role <<< "${test_accounts[$username]}" if test_user_auth "$username" "$password" "$expected_role"; then ((users_ok++)) fi done echo "" echo "=============================================================================" echo "📈 RÉSUMÉ FINAL" echo "=============================================================================" echo "" echo "🔐 Rôles : $roles_ok/$total_roles configurés correctement" echo "👥 Utilisateurs : $users_ok/$total_users authentifiés avec succès" echo "" if [ $roles_ok -eq $total_roles ] && [ $users_ok -eq $total_users ]; then log_success "🎉 Configuration UnionFlow Keycloak 100% opérationnelle !" echo "" echo "✅ Tous les rôles sont créés avec les bons niveaux" echo "✅ Tous les comptes de test fonctionnent" echo "✅ Les assignations de rôles sont correctes" echo "" echo "🚀 L'application mobile peut maintenant utiliser ces comptes pour les tests !" return 0 else log_error "❌ Configuration incomplète détectée" echo "" echo "🔧 Actions recommandées :" if [ $roles_ok -lt $total_roles ]; then echo " • Vérifier la création des rôles manquants" fi if [ $users_ok -lt $total_users ]; then echo " • Vérifier la création et configuration des utilisateurs" fi echo " • Relancer le script setup-unionflow-keycloak.sh si nécessaire" return 1 fi } # ============================================================================= # EXÉCUTION DU SCRIPT DE VÉRIFICATION # ============================================================================= echo "=============================================================================" echo "🔍 VÉRIFICATION CONFIGURATION UNIONFLOW KEYCLOAK" echo "=============================================================================" echo "" # Obtenir le token d'administration get_admin_token # Générer le rapport de statut complet generate_status_report echo "" echo "=============================================================================" echo "✅ VÉRIFICATION TERMINÉE" echo "============================================================================="