# Configuration du client Keycloak pour Lions User Manager

## Configuration requise

Le serveur attend un client avec les propriétés suivantes :
- **Client ID**: `lions-user-manager`
- **Realm**: `master`
- **Type**: Service Account (confidential client)
- **Secret**: `dev-secret-change-me` (ou générer un nouveau secret)

## Option 1 : Via l'interface web Keycloak

1. **Accéder à Keycloak Admin Console**
   - URL: http://localhost:8180
   - Se connecter avec `admin` / `admin`

2. **Sélectionner le realm `master`**
   - Dans le menu déroulant en haut à gauche

3. **Créer le client**
   - Aller dans **Clients** → **Create client**
   - **Client type**: OpenID Connect
   - **Client ID**: `lions-user-manager`
   - Cliquer sur **Next**

4. **Configurer le client**
   - **Client authentication**: ON (confidential client)
   - **Authorization**: OFF (pour l'instant)
   - **Authentication flow**: Standard flow: OFF, Direct access grants: OFF, Service accounts roles: ON
   - Cliquer sur **Next** puis **Save**

5. **Récupérer le secret**
   - Dans l'onglet **Credentials**
   - Copier le **Client secret** (ou régénérer si nécessaire)
   - Mettre à jour `application-dev.properties` avec ce secret :
     ```properties
     quarkus.oidc.credentials.secret=VOTRE_SECRET_ICI
     ```

6. **Attribuer les rôles au service account**
   - Aller dans **Users** → Chercher `service-account-lions-user-manager`
   - Cliquer sur l'utilisateur
   - Aller dans l'onglet **Role mapping**
   - Cliquer sur **Assign role**
   - Filtrer par **Filter by realm roles**
   - Sélectionner le rôle **admin** (ou les rôles nécessaires)
   - Cliquer sur **Assign**

## Option 2 : Via kcadm.sh (ligne de commande)

```bash
# 1. Se connecter à Keycloak
kcadm.sh config credentials \
    --server http://localhost:8180 \
    --realm master \
    --user admin \
    --password admin

# 2. Créer le client
kcadm.sh create clients -r master -s clientId=lions-user-manager \
    -s enabled=true \
    -s serviceAccountsEnabled=true \
    -s standardFlowEnabled=false \
    -s directAccessGrantsEnabled=false \
    -s publicClient=false \
    -s protocol=openid-connect

# 3. Récupérer l'UUID du client
CLIENT_UUID=$(kcadm.sh get clients -r master --fields id,clientId | \
    jq -r '.[] | select(.clientId=="lions-user-manager") | .id')

# 4. Récupérer ou définir le secret
# Option A: Récupérer le secret généré automatiquement
kcadm.sh get "clients/$CLIENT_UUID/client-secret" -r master

# Option B: Définir un secret personnalisé
kcadm.sh update "clients/$CLIENT_UUID/client-secret" -r master \
    -s value=dev-secret-change-me

# 5. Attribuer le rôle admin au service account
kcadm.sh add-roles -r master \
    --uusername "service-account-lions-user-manager" \
    --rolename admin
```

## Option 3 : Script PowerShell (Windows)

Créez un fichier `setup-keycloak-client.ps1` :

```powershell
# Configuration
$KEYCLOAK_URL = "http://localhost:8180"
$ADMIN_USER = "admin"
$ADMIN_PASSWORD = "admin"
$REALM = "master"
$CLIENT_ID = "lions-user-manager"
$CLIENT_SECRET = "dev-secret-change-me"

# Obtenir le token admin
$tokenResponse = Invoke-RestMethod -Uri "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" `
    -Method Post `
    -ContentType "application/x-www-form-urlencoded" `
    -Body @{
        grant_type = "password"
        client_id = "admin-cli"
        username = $ADMIN_USER
        password = $ADMIN_PASSWORD
    }

$accessToken = $tokenResponse.access_token
$headers = @{
    "Authorization" = "Bearer $accessToken"
    "Content-Type" = "application/json"
}

# Créer le client
$clientBody = @{
    clientId = $CLIENT_ID
    enabled = $true
    serviceAccountsEnabled = $true
    standardFlowEnabled = $false
    directAccessGrantsEnabled = $false
    publicClient = $false
    protocol = "openid-connect"
} | ConvertTo-Json

try {
    $createResponse = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/clients" `
        -Method Post `
        -Headers $headers `
        -Body $clientBody
    
    Write-Host "Client créé avec succès"
} catch {
    Write-Host "Erreur lors de la création du client: $_"
    exit 1
}

# Récupérer l'UUID du client
$clients = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/clients?clientId=$CLIENT_ID" `
    -Method Get `
    -Headers $headers

$clientUuid = $clients[0].id
Write-Host "Client UUID: $clientUuid"

# Définir le secret
$secretBody = @{
    value = $CLIENT_SECRET
} | ConvertTo-Json

Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/clients/$clientUuid/client-secret" `
    -Method Put `
    -Headers $headers `
    -Body $secretBody

Write-Host "Secret défini: $CLIENT_SECRET"

# Attribuer le rôle admin au service account
$serviceAccountUsername = "service-account-$CLIENT_ID"
$users = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users?username=$serviceAccountUsername" `
    -Method Get `
    -Headers $headers

if ($users.Count -eq 0) {
    Write-Host "Service account non trouvé. Il sera créé automatiquement lors de la première utilisation."
} else {
    $serviceAccountId = $users[0].id
    
    # Récupérer le rôle admin
    $roles = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/roles/admin" `
        -Method Get `
        -Headers $headers
    
    # Assigner le rôle
    $roleBody = @($roles) | ConvertTo-Json
    
    Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users/$serviceAccountId/role-mappings/realm" `
        -Method Post `
        -Headers $headers `
        -Body $roleBody
    
    Write-Host "Rôle admin attribué au service account"
}

Write-Host "Configuration terminée!"
```

## Vérification

Après la configuration, vérifiez que :

1. Le client existe dans Keycloak
2. Le secret correspond à celui dans `application-dev.properties`
3. Le service account a les rôles nécessaires

## Redémarrer le serveur

Une fois le client configuré, redémarrez le serveur Quarkus :

```bash
mvn quarkus:dev -pl lions-user-manager-server-impl-quarkus
```

Le serveur devrait maintenant pouvoir s'authentifier auprès de Keycloak.

