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
- L'utilisateur se connecte
- Mon mappeur de protocole personnalisé est appelé, où j'écrase la méthode transformAccessToken
- 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.
- 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.
- 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:
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é
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
Vous implémentez une classe CustomProtocolMapper basée sur AbstractOIDCProtocolMapper
META-INF/services Le fichier portant le nom org.keycloak.protocol.ProtocolMapper
Doit être disponible et contient le nom de votre mappeur
jboss-deployment-structure.xml
Doit être disponible pour utiliser le keycloak intégré dans les classes
Le fichier Jar est déployé dans /opt/jboss/keycloak/standalone/deployments/
Bon maintenant plus de détails :-)
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. ;-)
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
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 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