Keycloak est une solution open source de gestion des identités et des accès (IAM). Cet article décrit la configuration d'un client OAuth 2.0 / OpenID Connect dans Keycloak, en détaillant les options importantes et en montrant comment restreindre l'accès aux utilisateurs ou groupes autorisés.
Note de version. L'interface d'administration a été refondue à partir de Keycloak 19. La notion d'Access Type (
confidential/public/bearer-only) a disparu au profit des toggles Client authentication et Authorization. Ce guide suit l'UI actuelle (Keycloak 24+).
1. Prérequis
- Une instance Keycloak fonctionnelle (version 24 ou supérieure recommandée).
- Des droits d'administration sur un realm.
- Une application destinée à s'authentifier via OAuth 2.0 / OIDC.
- TLS activé sur Keycloak et sur l'application cliente (obligatoire en production).
2. Qu'est-ce qu'un client dans Keycloak ?
Dans Keycloak, un client représente une application ou un service qui interagit avec le serveur d'authentification, soit pour authentifier des utilisateurs, soit pour obtenir des informations sur eux, soit pour protéger ses propres ressources. Il peut s'agir d'une application web, d'une API, d'une application mobile, d'un service interne ou d'un partenaire tiers.
Chaque client est rattaché à un realm (l'espace logique d'authentification) et identifié par un client_id unique. Cet identifiant est transmis lors de toute demande d'authentification ou d'obtention de jeton.
La configuration d'un client définit notamment :
- les flux OAuth 2.0 autorisés (
authorization_code,client_credentials, etc.) ; - la capacité ou non du client à conserver un secret (client confidentiel vs public) ;
- les URI de redirection acceptées et les origines CORS ;
- la durée de vie des jetons et la composition des claims (mappers) ;
- les politiques d'autorisation associées (rôles, groupes, attributs).
3. Création du client
- Se connecter à la Keycloak Admin Console.
- Sélectionner le realm cible.
- Menu Clients > Create client.
Étape « General settings »
| Champ | Valeur recommandée | Description |
|---|---|---|
| Client type | OpenID Connect |
Protocole utilisé. Choisir SAML uniquement pour des intégrations SAML 2.0. |
| Client ID | myapp-client |
Identifiant unique du client dans le realm. Apparaît dans les jetons (azp). |
| Name | My Application |
Libellé d'affichage (facultatif, peut être localisé). |
| Description | Texte libre | Aide à la maintenance. |
Étape « Capability config »
| Toggle | Valeur recommandée | Détail |
|---|---|---|
| Client authentication | ON pour un backend, OFF pour un SPA |
ON rend le client confidentiel (un secret est généré). OFF rend le client public. |
| Authorization | OFF |
À activer uniquement si l'on souhaite utiliser le moteur d'autorisations fine (RBAC/ABAC) de Keycloak. |
| Standard flow | ON |
Active le flux Authorization Code, à utiliser systématiquement. |
| Direct access grants | OFF |
Flux password — déconseillé par OAuth 2.1, à n'utiliser que pour des outils internes legacy. |
| Implicit flow | OFF |
Déprécié par OAuth 2.1, ne pas activer. |
| Service accounts roles | ON si client_credentials |
Permet au client de récupérer un jeton pour son propre compte (machine-to-machine). |
| OAuth 2.0 Device Auth Grant | OFF (sauf besoin spécifique) |
Pour les appareils sans navigateur (TV, CLI sans IHM locale). |
| OIDC CIBA Grant | OFF (sauf besoin spécifique) |
Authentification déportée (canal hors-bande). |
Étape « Login settings »
| Champ | Exemple | Description |
|---|---|---|
| Root URL | https://app.example.com |
URL de base de l'application. Permet d'utiliser des chemins relatifs dans les champs suivants. |
| Home URL | / |
Page par défaut après login. |
| Valid redirect URIs | https://app.example.com/* |
URI exactes autorisées pour la redirection après authentification. Éviter les wildcards larges. |
| Valid post logout redirect URIs | https://app.example.com/* |
URI autorisées pour la redirection après déconnexion (RP-Initiated Logout). |
| Web origins | https://app.example.com |
Origines CORS autorisées. La valeur + reprend automatiquement les redirect URIs ; * est à proscrire. |
| Admin URL | https://app.example.com |
Utilisé pour les notifications backchannel (logout global, push not-before). |
Bonne pratique. Les redirect URIs doivent être en
https://en production (saufhttp://localhostpour le développement). Spécifier des chemins aussi précis que possible plutôt qu'un wildcard/*.
4. Authentification du client (Credentials)
L'onglet Credentials n'apparaît que si Client authentication est sur ON. Plusieurs méthodes sont disponibles :
| Méthode | Usage |
|---|---|
| Client Id and Secret | Secret partagé classique. À stocker dans un coffre-fort (Vault, env vars chiffrées). |
| Signed JWT | Le client signe un JWT d'assertion avec sa clé privée. Plus sûr qu'un secret. |
| Signed JWT with Client Secret | Variante symétrique (HMAC). |
| X.509 Certificate | mTLS — recommandé pour les contextes à forte exigence (FAPI, banque). |
Important. Le secret ne doit jamais être commité dans Git ni embarqué dans un binaire distribué. Pour un projet où les secrets vivent dans
config/.env, ne commiter queconfig/.env.example.
5. Types de clients
Depuis Keycloak 19, le « type » est déduit de la combinaison des toggles. La terminologie OAuth reste utile :
| Type | Configuration Keycloak | Cas d'usage |
|---|---|---|
| Confidentiel | Client authentication = ON |
Backend serveur (PHP, Node, Java…), BFF, service-to-service. |
| Public | Client authentication = OFF + Standard flow = ON + PKCE |
SPA (React, Vue, Angular), application mobile, CLI native. |
| Service account | Client authentication = ON + Service accounts roles = ON |
Communication machine-to-machine (grant_type=client_credentials). |
Le type « bearer-only » a été retiré : pour une API qui se contente de valider des jetons sans déclencher d'authentification, créer un client confidentiel et n'activer aucun flux.
6. PKCE — recommandé pour tous les clients
PKCE (Proof Key for Code Exchange, RFC 7636) protège le flux Authorization Code contre l'interception du code d'autorisation. Conçu initialement pour les clients publics, il est aujourd'hui recommandé pour tous les clients, y compris confidentiels, et obligatoire dans OAuth 2.1.
Activation dans Advanced > Proof Key for Code Exchange Code Challenge Method > S256.
Ne jamais utiliser
plain;S256est la seule valeur acceptable.
7. Restreindre l'accès aux utilisateurs ou groupes
Par défaut, tout utilisateur du realm peut se connecter via n'importe quel client. Deux approches permettent de restreindre cet accès.
Approche 1 — Authentification basée sur les rôles (simple)
- Créer un rôle client dédié, par exemple
app-user, dans l'onglet Roles du client. - Assigner ce rôle aux utilisateurs ou groupes autorisés (Users > user > Role mapping, ou Groups > group > Role mapping).
- Dans Authentication > Flows, ajouter une exécution
Conditional - User Roleau flux Browser, configurée avec le rôle requis etRequired.
Cette méthode bloque l'authentification elle-même : un utilisateur sans le rôle ne pourra pas se connecter au client.
Approche 2 — Authorization Services (granulaire)
À utiliser pour gérer des permissions plus fines (ressources, scopes, conditions).
- Activer Authorization sur le client.
- Onglet Authorization > Policies > créer une Group Policy ou Role Policy listant les utilisateurs/groupes autorisés.
- Onglet Permissions > créer une Scope-Based Permission ou Resource-Based Permission liée à la policy.
- Côté application, utiliser l'endpoint UMA ou l'adaptateur Keycloak pour évaluer les permissions.
Approche 3 — Limiter le client scope « roles »
Dans Client scopes > roles > Scope, désactiver Full scope allowed et n'autoriser que les rôles pertinents. Cela réduit la taille des jetons et limite ce que le client peut « voir » des rôles utilisateurs.
8. Client scopes et mappers
Les client scopes déterminent les claims présents dans les jetons (access_token et id_token).
- Les scopes Default sont systématiquement ajoutés à chaque jeton.
- Les scopes Optional ne sont ajoutés que si l'application les demande via le paramètre
scope=lors de l'authentification.
Pour exposer les groupes d'un utilisateur dans le token :
- Créer un client scope
groups(ou réutiliser celui existant). - Ajouter un mapper de type Group Membership :
- Token Claim Name :
groups - Full group path :
OFF(sauf besoin d'arborescence) - Add to ID token / Access token / Userinfo : selon l'usage.
- Token Claim Name :
- Attacher le scope au client (Default ou Optional).
9. Réglages avancés à connaître
| Section | Réglage | Recommandation |
|---|---|---|
| Advanced > Fine grain OpenID Connect configuration | Access Token Signature Algorithm |
RS256 (par défaut) ou PS256 pour FAPI. |
| Advanced > Advanced settings | Proof Key for Code Exchange |
S256. |
| Advanced > Advanced settings | Front channel logout |
OFF sauf si l'application implémente correctement la spec OIDC Front-Channel Logout. |
| Advanced > Advanced settings | Backchannel logout URL |
Renseigner pour une déconnexion globale propre. |
| Advanced > Token Lifespan | Access Token Lifespan |
Court (5–15 min). Le refresh token prend le relais. |
| Sessions | Client Session Idle / Max |
Aligner sur la politique de session de l'organisation. |
Pour appliquer automatiquement un ensemble cohérent de règles, utiliser les Client Policies du realm (profils pré-définis oauth-2-1-for-confidential-client et oauth-2-1-for-public-client).
10. Checklist de sécurité
- [ ]
Client authentication = ONpour tout client qui peut conserver un secret. - [ ] PKCE
S256activé. - [ ] Implicit flow et Direct access grants désactivés.
- [ ] Redirect URIs en
https://et sans wildcard inutile. - [ ] Web origins explicites (pas de
*). - [ ] Secret stocké dans un coffre-fort, jamais commité.
- [ ] Access token court (≤ 15 min) et refresh token rotatif.
- [ ] Accès restreint via rôle dédié ou Authorization Services.
- [ ] Full scope allowed désactivé si les rôles transportés doivent être limités.
- [ ] Logout backchannel ou front-channel configuré.
Conclusion
La configuration d'un client OAuth 2.0 dans Keycloak repose sur quelques choix structurants — confidentiel ou public, flux activés, PKCE, restriction d'accès — qui ont chacun des implications de sécurité fortes. S'aligner sur OAuth 2.1 (PKCE systématique, pas d'implicit flow, pas de password grant) et utiliser les Client Policies pour appliquer ces règles à l'échelle du realm évite la plupart des configurations à risque.
Commentaires
Aucun commentaire pour l'instant. Soyez le premier !
Laisser un commentaire