Files
unionflow-server-api/verify-unionflow-keycloak.sh
2025-09-19 16:09:21 +00:00

253 lines
9.0 KiB
Bash

#!/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 "============================================================================="