# Configuration du Client Keycloak - Lions User Manager

## Problème Identifié

Le client JSF est en **boucle d'authentification infinie** :
```
Starting an authentication challenge for tenant Default
```

**Cause** : Le client `lions-user-manager-client` n'existe pas ou est mal configuré dans Keycloak.

---

## Solution : Créer le Client dans Keycloak

### Étape 1 : Accéder à la Console Admin Keycloak

1. Ouvrir : http://localhost:8180
2. Cliquer sur **Administration Console**
3. Se connecter avec :
   - **Username** : `admin`
   - **Password** : `admin`

### Étape 2 : Sélectionner le Realm

1. Dans le menu déroulant en haut à gauche, sélectionner : **lions-user-manager**
2. Si le realm n'existe pas, le créer :
   - Cliquer sur le menu déroulant
   - **Create Realm**
   - **Realm name** : `lions-user-manager`
   - **Save**

### Étape 3 : Créer le Client

1. Dans le menu de gauche, aller à **Clients**
2. Cliquer sur **Create client**

#### General Settings

- **Client type** : OpenID Connect
- **Client ID** : `lions-user-manager-client`
- Cliquer sur **Next**

#### Capability config

- **Client authentication** : **ON** (cocher)
- **Authorization** : OFF
- **Authentication flow** :
  - ✅ **Standard flow** (Authorization Code Flow)
  - ✅ **Direct access grants** (Resource Owner Password Credentials)
  - ❌ Implicit flow
  - ❌ Service accounts roles
- Cliquer sur **Next**

#### Login settings

- **Root URL** : `http://localhost:8082`
- **Home URL** : `http://localhost:8082`
- **Valid redirect URIs** :
  ```
  http://localhost:8082/*
  http://localhost:8082/auth/callback
  ```
- **Valid post logout redirect URIs** :
  ```
  http://localhost:8082/*
  ```
- **Web origins** :
  ```
  http://localhost:8082
  ```
- Cliquer sur **Save**

### Étape 4 : Récupérer le Client Secret

1. Aller dans l'onglet **Credentials**
2. Copier le **Client secret** affiché
3. **Important** : Vérifier que ce secret correspond à celui dans `application-dev.properties`

---

## Vérification de la Configuration Client

### Fichier : `application-dev.properties`

Vérifier que ces valeurs correspondent à la configuration Keycloak :

```properties
quarkus.oidc.auth-server-url=http://localhost:8180/realms/lions-user-manager
quarkus.oidc.client-id=lions-user-manager-client
quarkus.oidc.credentials.secret=VOTRE_CLIENT_SECRET_ICI
quarkus.oidc.token.issuer=http://localhost:8180/realms/lions-user-manager
```

**⚠️ IMPORTANT** : Remplacer `VOTRE_CLIENT_SECRET_ICI` par le secret obtenu à l'Étape 4.

---

## Configuration Avancée du Client (Optionnel mais Recommandé)

### Onglet Settings

#### Access settings
- **Access Type** : Confidential (automatique avec Client authentication ON)
- **Standard Flow Enabled** : ON
- **Direct Access Grants Enabled** : ON
- **Implicit Flow Enabled** : OFF
- **Service Accounts Enabled** : OFF

#### Authentication flow overrides
- **Browser Flow** : browser (défaut)
- **Direct Grant Flow** : direct grant (défaut)

### Onglet Advanced

#### Advanced Settings
- **Access Token Lifespan** : 5 Minutes (défaut, peut être augmenté en dev)
- **Client Session Idle** : 30 Minutes
- **Client Session Max** : 10 Hours
- **PKCE Code Challenge Method** : S256 (recommandé)

---

## Test de la Configuration

### Test 1 : Vérifier que Keycloak accepte le client

```bash
curl -X POST "http://localhost:8180/realms/lions-user-manager/protocol/openid-connect/token" \
  -d "client_id=lions-user-manager-client" \
  -d "client_secret=VOTRE_SECRET" \
  -d "grant_type=password" \
  -d "username=admin" \
  -d "password=admin"
```

**Résultat attendu** : Un JSON avec `access_token`, `refresh_token`, etc.

**Si erreur `invalid_client`** : Le client n'existe pas ou le secret est incorrect.

### Test 2 : Tester l'authentification via le navigateur

1. Arrêter le client JSF (Ctrl+C)
2. Supprimer les cookies du navigateur pour `localhost:8082`
3. Redémarrer le client : `mvn quarkus:dev`
4. Accéder à : http://localhost:8082/pages/user-manager/users/list.xhtml
5. **Résultat attendu** : Redirection vers Keycloak pour login

---

## Checklist de Vérification

- [ ] Realm `lions-user-manager` existe dans Keycloak
- [ ] Client `lions-user-manager-client` existe dans le realm
- [ ] Client authentication est **ON**
- [ ] Standard flow est **enabled**
- [ ] Valid redirect URIs contient `http://localhost:8082/*`
- [ ] Client secret dans `application-dev.properties` correspond au secret Keycloak
- [ ] Keycloak est accessible sur http://localhost:8180
- [ ] Le client JSF redémarre après modification du secret

---

## Dépannage

### Problème : "invalid_client"
- **Cause** : Client ID ou secret incorrect
- **Solution** : Vérifier que le client existe et que le secret correspond

### Problème : "invalid_redirect_uri"
- **Cause** : L'URL de redirection n'est pas dans la liste des Valid redirect URIs
- **Solution** : Ajouter `http://localhost:8082/*` dans les Valid redirect URIs

### Problème : Boucle infinie d'authentification
- **Cause** : Le client ne peut pas échanger le code d'autorisation contre un token
- **Solution** :
  1. Vérifier que Standard Flow est enabled
  2. Vérifier le client secret
  3. Vérifier les redirect URIs
  4. Supprimer les cookies du navigateur

### Problème : "unauthorized_client"
- **Cause** : Le flow d'authentification n'est pas autorisé
- **Solution** : Activer "Standard flow" dans la configuration du client

---

## Redémarrage après Configuration

Après avoir créé/modifié le client dans Keycloak :

```bash
# Arrêter le client JSF (Ctrl+C dans le terminal)

# Redémarrer
cd lions-user-manager/lions-user-manager-client-quarkus-primefaces-freya
mvn quarkus:dev
```

---

**Date** : 2025-12-25
**Statut** : Configuration requise avant utilisation
