# Configuration Client Mobile Keycloak pour UnionFlow ## Objectif Configurer un client Keycloak spécifique pour l'application mobile UnionFlow avec authentification OIDC. ## Étapes de Configuration ### 1. Créer le Client Mobile 1. Accéder à Keycloak Admin Console: http://localhost:8180/admin 2. Sélectionner le realm **unionflow** 3. Aller dans **Clients** → **Create client** ### 2. Configuration de Base - **Client type**: OpenID Connect - **Client ID**: `unionflow-mobile` - **Name**: `UnionFlow Mobile App` - **Description**: `Application mobile UnionFlow avec authentification OIDC` ### 3. Configuration Capability - **Client authentication**: OFF (Public client pour mobile) - **Authorization**: OFF (pas besoin pour l'app mobile) - **Standard flow**: ON (Authorization Code Flow) - **Direct access grants**: OFF (pas recommandé pour mobile) - **Implicit flow**: OFF (deprecated) - **Service accounts roles**: OFF ### 4. Configuration Login Settings - **Root URL**: `com.unionflow.mobile://` - **Home URL**: `com.unionflow.mobile://home` - **Valid redirect URIs**: - `com.unionflow.mobile://login-callback` - `com.unionflow.mobile://login-callback/*` - **Valid post logout redirect URIs**: - `com.unionflow.mobile://logout-callback` - `com.unionflow.mobile://logout-callback/*` - **Web origins**: `+` (pour permettre CORS depuis l'app) ### 5. Configuration Advanced Settings - **Access Token Lifespan**: 15 minutes - **Client Session Idle**: 30 minutes - **Client Session Max**: 12 hours - **Proof Key for Code Exchange Code Challenge Method**: S256 (PKCE pour sécurité mobile) ### 6. Configuration des Scopes Dans **Client scopes**, s'assurer que les scopes suivants sont assignés: - **openid** (Default) - **profile** (Default) - **email** (Default) - **roles** (Default) ### 7. Configuration des Mappers Ajouter des mappers personnalisés si nécessaire: #### Mapper: audience - **Name**: audience - **Mapper Type**: Audience - **Included Client Audience**: unionflow-server - **Add to access token**: ON #### Mapper: roles - **Name**: client-roles - **Mapper Type**: User Client Role - **Client ID**: unionflow-server - **Token Claim Name**: resource_access.unionflow-server.roles - **Add to access token**: ON ### 8. Test de Configuration #### Test 1: Authorization URL ``` http://localhost:8180/realms/unionflow/protocol/openid-connect/auth?client_id=unionflow-mobile&redirect_uri=com.unionflow.mobile://login-callback&response_type=code&scope=openid%20profile%20email%20roles&code_challenge=CHALLENGE&code_challenge_method=S256 ``` #### Test 2: Token Exchange ```bash curl -X POST "http://localhost:8180/realms/unionflow/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code&client_id=unionflow-mobile&code=AUTHORIZATION_CODE&redirect_uri=com.unionflow.mobile://login-callback&code_verifier=VERIFIER" ``` ### 9. Configuration Android (android/app/src/main/AndroidManifest.xml) ```xml ``` ### 10. Configuration iOS (ios/Runner/Info.plist) ```xml CFBundleURLTypes CFBundleURLName com.unionflow.mobile CFBundleURLSchemes com.unionflow.mobile ``` ### 11. Validation de la Configuration #### Vérifications à effectuer: 1. ✅ Client créé avec le bon type (Public) 2. ✅ Redirect URIs configurées correctement 3. ✅ PKCE activé (S256) 4. ✅ Scopes appropriés assignés 5. ✅ Mappers de rôles configurés 6. ✅ Configuration mobile (Android/iOS) ajoutée #### Tests fonctionnels: 1. **Test d'autorisation**: L'app peut ouvrir le navigateur pour l'auth 2. **Test de callback**: L'app reçoit le code d'autorisation 3. **Test de token**: L'app peut échanger le code contre des tokens 4. **Test d'API**: L'app peut appeler les APIs backend avec le token ### 12. Sécurité Mobile #### Bonnes pratiques implémentées: - **PKCE**: Protection contre l'interception du code d'autorisation - **Client Public**: Pas de secret stocké dans l'app - **Deep Links sécurisés**: Schéma d'URL spécifique à l'app - **Token sécurisé**: Stockage dans FlutterSecureStorage - **Refresh automatique**: Gestion transparente de l'expiration ## Résultat Attendu - ✅ Authentification OIDC fonctionnelle depuis l'app mobile - ✅ Tokens JWT valides pour les appels API backend - ✅ Gestion automatique du refresh des tokens - ✅ Déconnexion propre avec invalidation côté Keycloak