web-dev-qa-db-fra.com

Keycloak ajoute des revendications supplémentaires à partir de la base de données / source externe avec un mappeur de protocole personnalisé

J'ai vu ces deux articles qui donnent une solution à cette question, mais ils ne fournissent pas suffisamment d'informations détaillées sur la façon de le faire pour les développeurs non Java comme moi:

Keycloak ajouter des revendications supplémentaires à partir de la base de données/source externe

Comment enregistrer un ProtocolMapper personnalisé dans Keycloak?

Voici un récapitulatif de leurs solutions qui pourraient aider les autres si elles étaient remplies de détails.

Processus attendu à partir du 1er lien

  1. L'utilisateur se connecte
  2. Mon mappeur de protocole personnalisé est appelé, où j'écrase la méthode transformAccessToken
  3. Ici, je me connecte au client où le mappeur de protocole est dans keycloak, en tant que service. Ici, n'oubliez pas d'utiliser un autre ID client à la place de celui pour lequel vous créez le mappeur de protocole, sinon vous entrerez dans une récursivité sans fin.
  4. J'obtiens le jeton d'accès dans le mappeur de protocole et j'appelle le point de terminaison de repos de mon application pour récupérer les revendications supplémentaires, qui sont sécurisées.
  5. Obtenez les informations retournées par le point de terminaison et ajoutez-les en tant que revendications supplémentaires

Étapes pour y parvenir à partir du 2ème lien

Implémentez l'interface ProtocolMapper et ajoutez le fichier "META-INF/services/org.keycloak.protocol.ProtocolMapper" contenant la référence à la classe.

À ce stade, Keycloak reconnaît la nouvelle implémentation. Et vous devriez pouvoir le configurer via la console d'administration.

Pour ajouter des données au jeton, ajoutez les interfaces suivantes

org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper

et implémenter les méthodes selon l'interface

Ajoutez ensuite le fichier " META-INF/jboss-deployment-structure.xml" avec le contenu suivant

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

Et après avoir fait tout cela, la méthode transformAccessToken () personnalisée est appelée à chaque demande de l'URL http: //:/auth/realms/testrealm/protocol/openid-connect/token

Après avoir lu ceci, j'ai quelques questions:

  1. Comment "implémentez-vous le ProtocolMapper"
  2. Où ajoutez-vous les fichiers mentionnés précédemment? (ne peut voir aucun répertoire META-INF/dans mon dossier d'installation Keycloak)
  3. Comment et où ajoutez-vous les interfaces suivantes?
  4. À quoi ressemble le transformAccessToken () personnalisé

Merci à tous pour votre temps. Faites-moi savoir si je manque de résumer leurs réponses.

Modifier:

Je commence une prime avec l'espoir que quelqu'un sera en mesure de me donner des étapes détaillées sur la façon d'ajouter des revendications supplémentaires à partir de la base de données dans Keycloak 3.4.3 (assez détaillé pour un non Java dev)

Edit 2 Une méthode décrite ici pourrait faire l'affaire mais manquer de détails. Keycloak crée un mappeur de fournisseur d'identité personnalisé

9
AlaricB

J'espère que ce guide étape par étape vous aidera

J'utilise Keycloak 4.5.0 - car j'ai cette nouvelle version installée - mais je ne devrais pas faire une grande différence. Et j'ai implémenté un OIDCProtocolMapper dans l'exemple.

Juste pour le résumer - pour un aperçu rapide pour les autres - chaque étape est décrite plus en détail plus tard

  1. Vous implémentez une classe CustomProtocolMapper basée sur AbstractOIDCProtocolMapper

  2. META-INF/services Le fichier portant le nom org.keycloak.protocol.ProtocolMapper Doit être disponible et contient le nom de votre mappeur

  3. jboss-deployment-structure.xml Doit être disponible pour utiliser le keycloak intégré dans les classes

  4. Le fichier Jar est déployé dans /opt/jboss/keycloak/standalone/deployments/

Bon maintenant plus de détails :-)

Créez votre mappeur personnalisé

Je vous ai téléchargé mon maven pom.xml ( pom ) - il suffit de l'importer dans votre IDE et toutes les dépendances doivent être chargées automatiquement. Les dépendances sont juste provided et sera utilisé plus tard à partir de keycloak directement lors de l'exécution

La propriété keycloak.version Est pertinente - toutes les dépendances de keycloak sont actuellement chargées dans la version 4.5.0.Final

Maintenant, j'ai créé une classe de mappeur de protocoles personnalisée appelée CustomOIDCProtocolMapper. Trouvez le code "complet" ici

Il doit étendre AbstractOIDCProtocolMapper et doit implémenter toutes les méthodes abstraites. Peut-être que vous voulez avoir un mappeur de protocole SAML alors c'est une autre classe de base (AbstractSAMLProtocolMapper)

une méthode pertinente est transformAccessToken - ici, je définit une revendication supplémentaire pour le AccessToken. Vous avez besoin de votre logique ici mais oui - cela dépend de votre base de données, etc. ;-)

Fichier Services

Le fichier de services est important pour que keycloak trouve votre implémentation personnalisée

Placez un fichier avec le fileName org.keycloak.protocol.ProtocolMapper À l'intérieur de \src\main\resources\META-INF\services\

Dans ce fichier, vous écrivez dans le nom de votre fournisseur personnalisé - afin que keycloak sache que cette classe est disponible en tant que mappeur de protocole
Dans mon exemple, le contenu du fichier est juste une ligne

com.stackoverflow.keycloak.custom.CustomOIDCProtocolMapper

Structure de déploiement XML

Dans votre mappeur personnalisé, vous utilisez des fichiers de keycloak. Pour les utiliser, nous devons informer jboss de cette dépendance. Créez donc un fichier jboss-deployment-structure.xml À l'intérieur de \src\main\resources\META-INF\ Contenu:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.keycloak.keycloak-services" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

Créez et déployez votre extension

Créez un fichier jar de votre extension (mvn clean package) - et placez le jar dans /opt/jboss/keycloak/standalone/deployments/ Et redémarrez keycloak

Dans le fichier journal, vous devriez voir quand il est déployé et (espérons-le non) des messages d'erreur

Vous pouvez maintenant utiliser votre mappeur - Dans mon exemple, je peux créer un mappeur dans l'interface utilisateur de keycloak et sélectionner Stackoverflow Custom Protocol Mapper Dans la liste déroulante

Tout comme info - ce n'est pas entièrement pris en charge officiellement par keycloak - les interfaces pourraient donc changer dans les versions ultérieures

J'espère que c'est compréhensible et que vous serez en mesure de mettre en œuvre avec succès votre propre mappeur

EDIT: Structure de fichier Eclipse exportée Zip

11
Evil_skunk