#!/bin/bash # Configuration complète de Keycloak pour UnionFlow echo "🔐 Configuration complète de Keycloak pour UnionFlow" echo "====================================================" # Variables KEYCLOAK_URL="http://localhost:8180" REALM_NAME="unionflow" CLIENT_ID="unionflow-server" CLIENT_SECRET="unionflow-secret-2025" # Couleurs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # Fonction pour obtenir un token admin get_admin_token() { echo -e "${YELLOW}📡 Obtention du token admin...${NC}" TOKEN_RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=admin&password=admin&grant_type=password&client_id=admin-cli") ACCESS_TOKEN=$(echo $TOKEN_RESPONSE | grep -o '"access_token":"[^"]*' | cut -d'"' -f4) if [ -n "$ACCESS_TOKEN" ]; then echo -e "${GREEN}✅ Token admin obtenu${NC}" return 0 else echo -e "${RED}❌ Impossible d'obtenir le token admin${NC}" echo "Réponse: $TOKEN_RESPONSE" return 1 fi } # Fonction pour supprimer et recréer le realm recreate_realm() { echo -e "${YELLOW}🏛️ Suppression et recréation du realm '$REALM_NAME'...${NC}" # Supprimer le realm s'il existe curl -s -X DELETE "$KEYCLOAK_URL/admin/realms/$REALM_NAME" \ -H "Authorization: Bearer $ACCESS_TOKEN" > /dev/null sleep 2 # Créer le nouveau realm REALM_CONFIG='{ "realm": "'$REALM_NAME'", "displayName": "UnionFlow", "enabled": true, "registrationAllowed": false, "registrationEmailAsUsername": true, "rememberMe": true, "verifyEmail": false, "loginWithEmailAllowed": true, "duplicateEmailsAllowed": false, "resetPasswordAllowed": true, "editUsernameAllowed": false, "sslRequired": "external", "defaultLocale": "fr" }' RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/admin/realms" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$REALM_CONFIG" \ -w "%{http_code}") if [[ "$RESPONSE" == *"201"* ]]; then echo -e "${GREEN}✅ Realm '$REALM_NAME' créé${NC}" sleep 2 return 0 else echo -e "${RED}❌ Erreur lors de la création du realm${NC}" return 1 fi } # Fonction pour créer le client create_client() { echo -e "${YELLOW}🔧 Création du client '$CLIENT_ID'...${NC}" CLIENT_CONFIG='{ "clientId": "'$CLIENT_ID'", "name": "UnionFlow Server API", "enabled": true, "clientAuthenticatorType": "client-secret", "secret": "'$CLIENT_SECRET'", "protocol": "openid-connect", "publicClient": false, "serviceAccountsEnabled": true, "standardFlowEnabled": true, "implicitFlowEnabled": false, "directAccessGrantsEnabled": true, "authorizationServicesEnabled": false, "redirectUris": ["http://localhost:8080/*"], "webOrigins": ["http://localhost:8080", "*"], "fullScopeAllowed": true }' RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/clients" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$CLIENT_CONFIG" \ -w "%{http_code}") if [[ "$RESPONSE" == *"201"* ]]; then echo -e "${GREEN}✅ Client '$CLIENT_ID' créé${NC}" return 0 else echo -e "${RED}❌ Erreur lors de la création du client${NC}" return 1 fi } # Fonction pour créer les rôles create_roles() { echo -e "${YELLOW}👥 Création des rôles...${NC}" ROLES=("ADMIN" "PRESIDENT" "SECRETAIRE" "TRESORIER" "GESTIONNAIRE_MEMBRE" "ORGANISATEUR_EVENEMENT" "MEMBRE") for ROLE_NAME in "${ROLES[@]}"; do ROLE_CONFIG='{ "name": "'$ROLE_NAME'", "description": "Rôle '$ROLE_NAME' pour UnionFlow" }' curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$ROLE_CONFIG" > /dev/null echo -e " ${GREEN}✅ Rôle '$ROLE_NAME' créé${NC}" done } # Fonction pour créer un utilisateur de test create_test_user() { echo -e "${YELLOW}👤 Création de l'utilisateur de test...${NC}" USER_CONFIG='{ "username": "testuser", "email": "test@unionflow.dev", "firstName": "Test", "lastName": "User", "enabled": true, "emailVerified": true }' RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$USER_CONFIG" \ -w "%{http_code}") if [[ "$RESPONSE" == *"201"* ]]; then echo -e "${GREEN}✅ Utilisateur créé${NC}" # Récupérer l'ID de l'utilisateur USER_ID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users?username=testuser" \ -H "Authorization: Bearer $ACCESS_TOKEN" | \ grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4) if [ -n "$USER_ID" ]; then # Définir le mot de passe PASSWORD_CONFIG='{ "type": "password", "value": "test123", "temporary": false }' curl -s -X PUT "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users/$USER_ID/reset-password" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$PASSWORD_CONFIG" echo -e "${GREEN}✅ Mot de passe défini${NC}" # Assigner le rôle MEMBRE ROLE_DATA=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles/MEMBRE" \ -H "Authorization: Bearer $ACCESS_TOKEN") if [[ "$ROLE_DATA" == *'"name"'* ]]; then ROLE_ASSIGNMENT="[$ROLE_DATA]" curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users/$USER_ID/role-mappings/realm" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "$ROLE_ASSIGNMENT" echo -e "${GREEN}✅ Rôle MEMBRE assigné${NC}" fi fi return 0 else echo -e "${RED}❌ Erreur lors de la création de l'utilisateur${NC}" return 1 fi } # Fonction pour tester l'authentification test_authentication() { echo -e "${YELLOW}🧪 Test d'authentification...${NC}" AUTH_RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/realms/$REALM_NAME/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=testuser&password=test123&grant_type=password&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET") AUTH_TOKEN=$(echo $AUTH_RESPONSE | grep -o '"access_token":"[^"]*' | cut -d'"' -f4) if [ -n "$AUTH_TOKEN" ]; then echo -e "${GREEN}✅ Authentification réussie !${NC}" echo -e "${CYAN}🔑 Token obtenu (tronqué): ${AUTH_TOKEN:0:50}...${NC}" # Test d'accès à l'API echo -e "${YELLOW}🧪 Test d'accès à l'API UnionFlow...${NC}" API_RESPONSE=$(curl -s -w "%{http_code}" -H "Authorization: Bearer $AUTH_TOKEN" "http://localhost:8080/api/organisations") HTTP_CODE=$(echo "$API_RESPONSE" | tail -c 4) if [ "$HTTP_CODE" = "200" ]; then echo -e "${GREEN}✅ Accès API réussi !${NC}" elif [ "$HTTP_CODE" = "403" ]; then echo -e "${YELLOW}⚠️ Accès refusé - Permissions insuffisantes (normal pour un utilisateur MEMBRE)${NC}" else echo -e "${YELLOW}⚠️ Code de réponse: $HTTP_CODE${NC}" fi return 0 else echo -e "${RED}❌ Échec de l'authentification${NC}" echo "Réponse: $AUTH_RESPONSE" return 1 fi } # Script principal main() { echo -e "${CYAN}🚀 Démarrage de la configuration complète...${NC}" echo "" # Obtenir le token admin if ! get_admin_token; then exit 1 fi # Recréer le realm if ! recreate_realm; then exit 1 fi # Créer le client if ! create_client; then exit 1 fi # Créer les rôles create_roles # Créer l'utilisateur de test if ! create_test_user; then exit 1 fi # Tester l'authentification if test_authentication; then echo "" echo -e "${GREEN}🎉 CONFIGURATION KEYCLOAK TERMINÉE AVEC SUCCÈS !${NC}" echo -e "${GREEN}===============================================${NC}" echo -e "${CYAN}📋 Informations de configuration :${NC}" echo -e " • Realm: $REALM_NAME" echo -e " • Client ID: $CLIENT_ID" echo -e " • Client Secret: $CLIENT_SECRET" echo -e " • URL Auth Server: $KEYCLOAK_URL/realms/$REALM_NAME" echo "" echo -e "${CYAN}👤 Utilisateur de test :${NC}" echo -e " • Username: testuser" echo -e " • Password: test123" echo -e " • Rôle: MEMBRE" echo "" echo -e "${CYAN}🔗 URLs importantes :${NC}" echo -e " • UnionFlow API: http://localhost:8080" echo -e " • Swagger UI: http://localhost:8080/q/swagger-ui" echo -e " • Health Check: http://localhost:8080/health" echo -e " • Keycloak Admin: http://localhost:8180/admin" echo "" echo -e "${GREEN}✅ L'intégration Keycloak avec UnionFlow est maintenant fonctionnelle !${NC}" else echo -e "${RED}❌ Échec de la configuration${NC}" exit 1 fi } # Exécuter le script principal main