Aujourd'hui, nous allons plonger sous le capot de Keycloak et nous salir les mains avec des mappages personnalisés, des extensions et des intégrations. Attachez vos ceintures, car ce voyage promet d'être mouvementé !

Résumé

Nous allons explorer en profondeur la personnalisation de Keycloak, en abordant :

  • Les mappages d'attributs utilisateur personnalisés
  • La création d'extensions Keycloak (SPIs)
  • L'implémentation de flux d'authentification personnalisés
  • L'intégration avec des systèmes externes

Si vous êtes prêt à transformer Keycloak en votre terrain de jeu personnel pour l'authentification, continuez à lire !

Mappages d'Attributs Utilisateur Personnalisés : Parce qu'une Taille Unique ne Convient Pas à Tous

Avouons-le, les attributs utilisateur par défaut dans Keycloak sont aussi excitants qu'une glace à la vanille. Mais ne vous inquiétez pas ! Nous pouvons pimenter les choses avec des mappages d'attributs personnalisés.

Ajouter des Attributs Personnalisés

Tout d'abord, ajoutons un attribut personnalisé à nos utilisateurs. Dans la console d'administration de Keycloak :

  1. Allez dans Utilisateurs > Attributs
  2. Ajoutez un nouvel attribut, disons "langageProgPréféré"

Maintenant, mappons cela à une revendication dans le jeton JWT. Rendez-vous dans Clients > [Votre Client] > Portée du Client > Portée dédiée > Ajouter un mappeur > Par Configuration > Attribut Utilisateur.

Remplissez les détails :

  • Nom : Langage de Programmation Préféré
  • Attribut Utilisateur : langageProgPréféré
  • Nom de la Revendication du Jeton : lang_pref

Voilà ! Maintenant, lorsqu'un utilisateur se connecte, son JWT inclura son langage de programmation préféré. Parce que pourquoi pas ?

Mappeur de Protocole Personnalisé

Mais attendez, il y a plus ! Que faire si nous voulons effectuer un traitement sophistiqué sur nos attributs avant qu'ils n'atteignent le jeton ? Voici les mappeurs de protocole personnalisés.

Créons un mappeur qui convertit notre langage préféré en majuscules (parce que crier notre amour pour Python est tout à fait normal).


public class UppercaseLanguageMapper extends AbstractOIDCProtocolMapper implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper {

    public static final String PROVIDER_ID = "uppercase-language-mapper";

    @Override
    public String getDisplayCategory() {
        return TOKEN_MAPPER_CATEGORY;
    }

    @Override
    public String getDisplayType() {
        return "Uppercase Language Mapper";
    }

    @Override
    public String getId() {
        return PROVIDER_ID;
    }

    @Override
    protected void setClaim(IDToken token, ProtocolMapperModel mappingModel, UserSessionModel userSession) {
        UserModel user = userSession.getUser();
        String favLang = user.getFirstAttribute("langageProgPréféré");
        if (favLang != null) {
            token.getOtherClaims().put("LANG_PREF", favLang.toUpperCase());
        }
    }
}

Voilà ce que j'appelle un mappage personnalisé ! Votre langage préféré sera crié sur tous les toits (ou du moins dans votre JWT).

Extensions Keycloak : Parce que Parfois, il Faut Briser les Règles

L'extensibilité de Keycloak est comme un terrain de jeu pour les passionnés d'authentification. Construisons une SPI (Interface de Fournisseur de Service) simple qui ajoute une action personnalisée au flux d'authentification.

Créer un Authentificateur Personnalisé

Imaginons que nous voulons ajouter un authentificateur qui vérifie si le mot de passe de l'utilisateur contient son nom d'utilisateur (une erreur de sécurité à éviter). Voici une version simplifiée :


public class UsernamePasswordValidator implements Authenticator {

    @Override
    public void authenticate(AuthenticationFlowContext context) {
        UserModel user = context.getUser();
        CredentialInput input = context.getHttpRequest().getDecodedFormParameters().getFirst(CredentialForm.PASSWORD);
        
        if (input.getValue().contains(user.getUsername())) {
            context.failureChallenge(AuthenticationFlowError.INVALID_CREDENTIALS, 
                context.form().setError("passwordContainsUsername").createErrorPage());
            return;
        }
        
        context.success();
    }

    // ... autres méthodes requises
}

Maintenant, vous devrez enregistrer cet authentificateur avec Keycloak et l'ajouter à votre flux d'authentification. Vos utilisateurs vous remercieront plus tard (ou vous maudiront maintenant, c'est un pari).

Logique d'Authentification Personnalisée : Parce que Parfois, il Faut Être Unique

Disons que votre entreprise a une méthode d'authentification ultra-secrète impliquant une boule magique et une tasse de café. Ne vous inquiétez pas, Keycloak est là pour vous !

Implémenter un Flux d'Authentification Personnalisé

Voici un aperçu de ce à quoi pourrait ressembler un flux d'authentification personnalisé :


public class CoffeeAuthenticator implements Authenticator {

    @Override
    public void authenticate(AuthenticationFlowContext context) {
        if (isCoffeeBrewed() && magicBallSaysYes()) {
            context.success();
        } else {
            context.failureChallenge(AuthenticationFlowError.INVALID_CREDENTIALS, 
                context.form().setError("needMoreCoffee").createErrorPage());
        }
    }

    private boolean isCoffeeBrewed() {
        // Implémentez votre logique de vérification du café ici
        return true;  // Optimistes, unissez-vous !
    }

    private boolean magicBallSaysYes() {
        // Consultez la boule magique
        return Math.random() > 0.5;  // 50/50 de chance, ça semble légitime
    }

    // ... autres méthodes requises
}

Rappelez-vous, avec un grand pouvoir vient une grande responsabilité. Utilisez cette connaissance avec sagesse, ou vous pourriez vous retrouver avec un système d'authentification qui ne fonctionne que tant que le café ne manque pas.

Intégration avec des Systèmes Externes : Bien S'entendre avec les Autres

Keycloak n'a pas besoin d'être un loup solitaire. Voyons comment nous pouvons le faire bien s'entendre avec des systèmes externes.

Fournisseur de Stockage Utilisateur Personnalisé

Imaginez que vous avez des données utilisateur stockées dans un système ancien qui utilise des cartes perforées (parce que pourquoi pas ?). Voici un exemple simplifié de la façon dont vous pourriez intégrer cela avec Keycloak :


public class PunchCardUserStorageProvider implements UserStorageProvider, UserLookupProvider, CredentialInputValidator {

    private PunchCardSystem punchCardSystem;

    @Override
    public UserModel getUserByUsername(String username, RealmModel realm) {
        PunchCardUser punchCardUser = punchCardSystem.findUserByHoles(username);
        if (punchCardUser != null) {
            return new UserAdapter(session, realm, model, punchCardUser);
        }
        return null;
    }

    @Override
    public boolean isValid(RealmModel realm, UserModel user, CredentialInput input) {
        if (!supportsCredentialType(input.getType())) return false;

        return punchCardSystem.validateCard(user.getUsername(), input.getChallengeResponse());
    }

    // ... autres méthodes requises
}

Maintenant, votre système vintage de cartes perforées peut authentifier les utilisateurs dans Keycloak. Bienvenue au 21ème siècle... en quelque sorte.

En Résumé : Keycloak est Votre Huître

Nous n'avons fait qu'effleurer la surface de ce qui est possible avec la personnalisation de Keycloak. De l'ajustement des attributs utilisateur à la création de fournisseurs d'authentification complets, Keycloak offre une plateforme robuste pour adapter votre système d'authentification à votre guise.

Rappelez-vous, avec un grand pouvoir vient une grande responsabilité (et potentiellement de gros maux de tête). Testez minutieusement, documentez religieusement, et que les dieux de l'authentification soient toujours en votre faveur.

Points Clés :

  • Les mappages d'attributs personnalisés ajoutent du style à vos jetons
  • Les SPIs ouvrent un monde d'extensibilité
  • Les flux d'authentification personnalisés permettent une logique unique (et potentiellement caféinée)
  • L'intégration avec des systèmes externes est possible, même pour les systèmes les plus anciens

Maintenant, allez de l'avant et personnalisez ! Et rappelez-vous, si quelqu'un vous demande pourquoi vous avez passé une semaine à implémenter un système d'authentification basé sur le café, dites simplement que c'est pour "une sécurité renforcée". Ils y croiront totalement.

"La seule façon de faire du bon travail est d'aimer ce que vous faites." - Steve Jobs

(Il ne parlait probablement pas de la personnalisation de Keycloak, mais on peut faire semblant.)

Bon codage, et que vos jetons soient toujours valides et votre café toujours fort !