# Corrections OIDC pour BTPXpress Client JSF - CONFIGURATION FINALE

## ✅ Configuration Keycloak vérifiée

Le client `btpxpress-frontend` est **correctement configuré**:
- ✅ Type: **Confidential Client** (converti depuis Public pour plus de sécurité)
- ✅ Standard Flow: Activé
- ✅ PKCE: S256 (activé même pour client confidential - défense en profondeur)
- ✅ Redirect URIs incluent: `http://localhost:8081/*`
- ✅ Implicit Flow: Désactivé (sécurité)
- ✅ Client Secret: `0Ph4e31lQQuonodmLQG3JycehbFL1Hei`

## ✅ Corrections appliquées dans application.properties

### 1. Configuration OIDC pour client confidential
```properties
# Client confidential avec secret (récupéré depuis Keycloak)
quarkus.oidc.credentials.secret=0Ph4e31lQQuonodmLQG3JycehbFL1Hei

# PKCE recommandé même pour client confidential
quarkus.oidc.authentication.pkce-required=true
# pkce-secret=false car on utilise un state-secret dédié (pas le client secret)
quarkus.oidc.authentication.pkce-secret=false
# State secret OBLIGATOIRE pour PKCE (32 caractères)
quarkus.oidc.authentication.state-secret=btpxpress-pkce-state-secret-32ch
```

### 2. Configuration de redirection
```properties
# Redirection après authentification
quarkus.oidc.authentication.redirect-path=/dashboard.xhtml
quarkus.oidc.authentication.restore-path-after-redirect=true
quarkus.oidc.authentication.java-script-auto-redirect=false
quarkus.oidc.authentication.force-redirect-https-scheme=false
```

### 3. Logging OIDC pour debugging
```properties
quarkus.log.category."io.quarkus.oidc".level=DEBUG
quarkus.log.category."io.quarkus.security".level=DEBUG
```

### 4. Permissions HTTP corrigées - CONFIGURATION FINALE
```properties
# Ressources publiques (ordre important - du plus spécifique au plus général)
# 1. Ressources statiques JSF et layout
quarkus.http.auth.permission.static.paths=/resources/*,/jakarta.faces.resource/*,/layout/*,/demo/*,/theme/*
quarkus.http.auth.permission.static.policy=permit

# 2. Pages d'erreur seulement (pas d'index ni login)
quarkus.http.auth.permission.public-pages.paths=/error.xhtml,/access-denied.xhtml
quarkus.http.auth.permission.public-pages.policy=permit

# 3. Toutes les autres pages nécessitent une authentification (y compris / et /index.xhtml)
quarkus.http.auth.permission.authenticated.paths=/*
quarkus.http.auth.permission.authenticated.policy=authenticated
```

### 5. Encryption des cookies de session
```properties
# Token state manager avec encryption
quarkus.oidc.token-state-manager.split-tokens=true
quarkus.oidc.token-state-manager.strategy=id-refresh-tokens
quarkus.oidc.token-state-manager.encryption-secret=btpxpress-secure-cookie-encryption-key-32chars-2025
quarkus.oidc.token-state-manager.encryption-required=false
quarkus.oidc.token-state-manager.cookie-max-size=8192
```

### 6. Suppression de index.xhtml
**IMPORTANT**: Le fichier `index.xhtml` a été supprimé pour permettre au flux OIDC de fonctionner correctement.

**Raison**: index.xhtml faisait une redirection HTML côté client vers dashboard.xhtml, ce qui contournait l'authentification OIDC. En supprimant ce fichier, lorsque l'utilisateur accède à `/`, OIDC intercepte la requête et redirige vers Keycloak pour l'authentification.

## ✅ Problèmes résolus

### Problème 1: Secret key encryption trop court
**Erreur**: "Secret key for encrypting state cookie is less than 16 characters long"

**Solution appliquée**:
1. Ajout du vrai client secret récupéré depuis Keycloak: `0Ph4e31lQQuonodmLQG3JycehbFL1Hei`
2. Ajout d'une clé d'encryption de 32 caractères pour les cookies de session
3. Conversion du client de PUBLIC à CONFIDENTIAL

### Problème 2: Flux OIDC ne se déclenche pas
**Symptôme**: L'utilisateur tape `http://localhost:8081` mais n'est pas redirigé vers Keycloak

**Cause**:
1. Le fichier `index.xhtml` faisait une redirection HTML côté client vers dashboard.xhtml
2. `/` et `/index.xhtml` étaient dans les pages publiques, donc OIDC ne les interceptait pas

**Solution appliquée**:
1. Suppression du fichier `index.xhtml`
2. Retrait de `/` et `/index.xhtml` des pages publiques dans application.properties
3. Maintenant OIDC intercepte toutes les requêtes vers `/` et redirige vers Keycloak

## 🧪 Tests à effectuer

### Test 1: Logs de démarrage
Lors du démarrage de l'application, vérifier les logs:

```bash
mvn quarkus:dev
```

Vous devriez voir:
```
INFO  [io.quarkus.oidc] OIDC enabled
DEBUG [io.quarkus.oidc] Discovered OIDC endpoints from https://security.lions.dev/realms/btpxpress/.well-known/openid-configuration
```

### Test 2: Accès à l'application

1. Ouvrir: `http://localhost:8081`
2. Vous devriez être redirigé vers Keycloak
3. Se connecter avec un utilisateur existant:
   - `admin@btpxpress.dev`
   - `directeur@btpxpress.dev`
   - `chef@btpxpress.dev`
   - `client@entreprise.com`

### Test 3: Analyser les logs lors de la connexion

Lors de la redirection depuis Keycloak, regarder les logs DEBUG:

**Succès attendu**:
```
DEBUG [io.quarkus.oidc.runtime.CodeAuthenticationMechanism] Authorization code flow has completed successfully
DEBUG [io.quarkus.oidc.runtime.CodeAuthenticationMechanism] ID token verification has succeeded
```

**Échec actuel**:
```
ERROR [io.quarkus.oidc.runtime.CodeAuthenticationMechanism] Authentication has failed
```

### Test 4: Vérifier l'URL de callback

Lors de la redirection depuis Keycloak vers l'application, l'URL devrait ressembler à:
```
http://localhost:8081/dashboard.xhtml?code=XXXXX&state=XXXXX
```

Si l'URL est différente, cela peut indiquer un problème de configuration.

## 🔧 Debugging avancé

Si le problème persiste, activer plus de logs:

```properties
# Dans application.properties
quarkus.log.category."io.vertx.ext.web.handler".level=DEBUG
quarkus.log.category."io.quarkus.vertx.http.runtime.security".level=DEBUG
```

## 📋 Checklist de vérification - COMPLÈTE

- [x] Client Keycloak configuré comme **confidential** avec secret
- [x] PKCE S256 activé
- [x] Redirect URIs incluent http://localhost:8081/*
- [x] application.properties configuré avec le vrai client secret
- [x] Encryption secret ajouté pour les cookies de session (32 caractères)
- [x] Permissions HTTP corrigées: seules les ressources statiques et pages d'erreur sont publiques
- [x] index.xhtml supprimé pour permettre à OIDC d'intercepter `/`
- [x] Logging OIDC activé pour debugging
- [x] Utilisateur de test supprimé (utilisateurs existants utilisés)
- [x] Configuration Keycloak mise à jour avec script PowerShell

## 🎯 Flux OIDC attendu

Maintenant que toute la configuration est en place, voici le flux attendu:

1. **Utilisateur accède à** `http://localhost:8081`
2. **OIDC intercepte** la requête (car `/` nécessite authentification)
3. **Redirection vers Keycloak** `https://security.lions.dev/realms/btpxpress/protocol/openid-connect/auth?...`
4. **Utilisateur se connecte** avec un des comptes existants
5. **Keycloak redirige vers** `http://localhost:8081/dashboard.xhtml?code=...&state=...`
6. **Application valide le code** auprès de Keycloak
7. **Session créée** avec cookie sécurisé
8. **Dashboard affiché** - utilisateur authentifié

## 🎯 Test à effectuer

1. **Redémarrer l'application**: `mvn quarkus:dev`
2. **Vider le cache du navigateur** (important!)
3. **Accéder à** `http://localhost:8081`
4. **Vérifier la redirection** vers security.lions.dev
5. **Se connecter** avec un utilisateur existant
6. **Vérifier la redirection** vers le dashboard

## 👥 Utilisateurs disponibles

- admin@btpxpress.dev
- directeur@btpxpress.dev
- chef@btpxpress.dev
- client@entreprise.com

(Utilisez le mot de passe que vous avez défini lors de leur création dans Keycloak)
