Как зарегистрировать пользовательский ProtocolMapper в Keycloak? - PullRequest
0 голосов
/ 25 мая 2018

Я борюсь с регистрацией пользовательского ProtocolMapper в Keycloak.Я хотел бы добавить некоторые данные из моей базы данных по запросу токена.Поэтому я последовал идее, изложенной в Keycloak, добавив дополнительные претензии из базы данных / внешнего источника .

Я реализовал интерфейс ProtocolMapper и добавил файл

META-INF/services/org.keycloak.protocol.ProtocolMapper

содержащий ссылку на мой класс.Пока все хорошо, и Keycloak признает новую реализацию.Я также могу настроить его через консоль администратора.

Чтобы добавить некоторые данные в токен, я думаю, что я также должен добавить один / несколько интерфейсов

org.keycloak.protocol.oidc.mappers.UserInfoTokenMapper org.keycloak.protocol.oidc.mappers.OIDCIDTokenMapper org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper

и реализовать методы в соответствии с интерфейсом (интерфейсами).

Проблема теперь в том, что, как только я добавляю интерфейс, я получаю следующее сообщение журнала:

08:55:07,292 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start service jboss.deployment.unit."keycloak-spi.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."keycloak-spi.jar".POST_MODULE
: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "keycloak-spi.jar"
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:172)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:2032)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1955)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: Failed to link at/lotterien/jam/keycloak/spi/JamAuthorizationInfoProtocolMapper (Module "deployment.keycloak-spi.jar" from Service Module Loader): org/keycloak/protocol/oidc/mappers/UserInfoTokenMapper
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:446)
        at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:274)
        at org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:77)
        at org.jboss.modules.Module.loadModuleClass(Module.java:713)
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:412)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:400)
        at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at java.util.ServiceLoader$LazyIterator.nextService(Unknown Source)
        at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
        at java.util.ServiceLoader$1.next(Unknown Source)
        at org.keycloak.provider.DefaultProviderLoader.load(DefaultProviderLoader.java:60)
        at org.keycloak.provider.ProviderManager.load(ProviderManager.java:92)
        at org.keycloak.services.DefaultKeycloakSessionFactory.loadFactories(DefaultKeycloakSessionFactory.java:214)
        at org.keycloak.services.DefaultKeycloakSessionFactory.deploy(DefaultKeycloakSessionFactory.java:115)
        at org.keycloak.provider.ProviderManagerRegistry.deploy(ProviderManagerRegistry.java:42)
        at org.keycloak.subsystem.server.extension.KeycloakProviderDeploymentProcessor.deploy(KeycloakProviderDeploymentProcessor.java:55)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:165)
        ... 5 more

Почему Keycloak не находит свой собственный интерфейс?Разве это не должно быть предоставлено из коробки?

Что мне не хватает, чтобы заставить его работать?


Редактировать 1

Iполучил немного дальше.Я добавил файл

META-INF / jboss-deploy-structure.xml

с содержимым

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

и теперь исключение пропало.

К сожалению, метод transformUserInfoToken () в моем классе все еще не вызывается по запросу токена.

Может кто-нибудь указать мне правильное направление, пожалуйста?

1 Ответ

0 голосов
/ 25 мая 2018

Наконец-то работает.Даже до сих пор есть открытые вопросы, я мог бы реализовать необходимую функциональность.

Мне пришлось реализовать интерфейс

org.keycloak.protocol.oidc.mappers.OIDCAccessTokenMapper

(вместо org.keycloak.protocol.oidc.mappers.UserInfoTokenMapper)

Теперь мой метод transformAccessToken () вызывается при каждом запросе URL http://<host>:<port>/auth/realms/testrealm/protocol/openid-connect/token

Я думаю, что проблема возниклаиз моего недопонимания терминов AccessToken, UserInfo и IDToken.Я думал, что все три являются частью сгенерированного токена.Но, похоже, OIDCAccessTokenMapper - единственный способ получить дополнительную информацию в токене доступа.

Остается открытым вопрос для меня, где появятся UserInfo и IDToken.Может быть, кто-то может дать ответ на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...