[keycloak-user] Provider Dependencies

Stian Thorgersen sthorger at redhat.com
Mon Nov 23 08:50:23 EST 2015


If you are deploying as a module it should not be in the providers folder.
It should be in modules/... and you refer to it in keycloak-server.json by
adding a module: <module-name>

On 23 November 2015 at 14:44, Ataraxus <atx at binaryninja.de> wrote:

> Hello Erik, Hey Stian,
>
> thanks for clarification. I tried as suggested in the keycloak
> documentation, but somehow it didn't worked :(
> I'm deploying it by dropping the jar into the providers folder and
> restarting jboss.
> How can i verify if it was loaded as a module? I'm using EAP 6.4 Overlay
> btw.
>
> This is the content of my .jar
>
> MYAPP.authenticator
> ├── META-INF
> │   ├── MANIFEST.MF
> │   ├── maven
> │   │   └── de.MYAPP.auth
> │   │       └── MYAPP.authenticator
> │   │           ├── pom.properties
> │   │           └── pom.xml
> │   └── services
> │       └── org.keycloak.authentication.AuthenticatorFactory
> ├── de
> │   └── MYAPP
> │       └── auth
> │           └── authenticator
> │               ├── MYAPPEmailAuthenticator.class
> │               ├── MYAPPEmailAuthenticatorFactory.class
> │               ├── MYAPPSAPAuthenticator.class
> │               ├── MYAPPSAPAuthenticatorFactory.class
> │               └── beans
> │                   └── ProfileBean.class
> └── modules
>     └── de
>         └── MYAPP
>             └── auth
>                 └── authenticator
>                     └── module.xml
>
> module.xml looks like this:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <module xmlns="urn:jboss:module:1.1" name="de.MYAPP.auth.authenticator">
>     <resources>
>         <resource-root path="MYAPP.authenticator.jar"/>
>     </resources>
>     <dependencies>
>         <module name="org.keycloak.keycloak-core"/>
>         <module name="org.keycloak.keycloak-model-api"/>
>         <module name="org.keycloak.keycloak-events-api"/>
>         <module name="org.keycloak.keycloak-services"/>
>         <module name="org.keycloak.keycloak-services"/>
>         <module name="org.keycloak.keycloak-login-api"/>
>         <module name="org.jboss.logging.jboss-logging"/>
>         <module name="javax.mail.mail"/>
>     </dependencies>
> </module>
>
> Am 23.11.15 um 14:18 schrieb Stian Thorgersen:
>
> Just look at Keycloak documentation:
>
> http://keycloak.github.io/docs/userguide/keycloak-server/html/providers.html#d4e458
>
> On 23 November 2015 at 14:07, Erik Mulder <erik.mulder at docdatapayments.com
> > wrote:
>
>> Hi Ataraxus,
>>
>>
>> I think the way to solve this is 'tapping in' to the Wildfly module
>> system. You need to add a module.xml to your provider jar under
>> src/main/resources/modules/some/module/name/module.xml and include a
>> reference to the java mail api there. That way you can tell Wildfly to
>> include that on the classpath when it's loading your provider classes.
>>
>>
>> I'm sorry, but I'm not sure how exactly this works in detail with path
>> names and module.xml contents. You can look at the keycloak sources for
>> module.xml examples, read the Wildfly module system documentation or maybe
>> someone else on the mailing list can answer you in more detail. Good luck!
>>
>>
>> ------------------------------
>> *From:* Ataraxus <atx at binaryninja.de> <atx at binaryninja.de>
>> *To:*  <ewjmulder at yahoo.com>"ewjmulder at yahoo.com" <ewjmulder at yahoo.com>
>> <ewjmulder at yahoo.com><ewjmulder at yahoo.com> <ewjmulder at yahoo.com>
>> *Sent:* Monday, November 23, 2015 1:57 PM
>> *Subject:* Re: [keycloak-user] Provider Dependencies
>>
>> Here is the code and the stacktrace just in case, maybe there is a better
>> way to send email:
>>
>> private void send(UserModel user, AuthenticationFlowContext context,
>> String subject, String textBody, String htmlBody) throws EmailException {
>>         try {
>>             String address = user.getEmail();
>>             Map<String, String> config =
>> context.getRealm().getSmtpConfig();
>>
>>             Properties props = new Properties();
>>             props.setProperty("mail.smtp.host", config.get("host"));
>>
>>             boolean auth = "true".equals(config.get("auth"));
>>             boolean ssl = "true".equals(config.get("ssl"));
>>             boolean starttls = "true".equals(config.get("starttls"));
>>
>>             if (config.containsKey("port")) {
>>                 props.setProperty("mail.smtp.port", config.get("port"));
>>             }
>>
>>             if (auth) {
>>                 props.put("mail.smtp.auth", "true");
>>             }
>>
>>             if (ssl) {
>>                 props.put("mail.smtp.socketFactory.port",
>> config.get("port"));
>>                 props.put("mail.smtp.socketFactory.class",
>> "javax.net.ssl.SSLSocketFactory");
>>             }
>>
>>             if (starttls) {
>>                 props.put("mail.smtp.starttls.enable", "true");
>>             }
>>
>>             String from = config.get("from");
>>
>>             Session session = Session.getInstance(props);
>>
>>             Multipart multipart = new MimeMultipart("alternative");
>>
>>             if (textBody != null) {
>>                 MimeBodyPart textPart = new MimeBodyPart();
>>                 textPart.setText(textBody, "UTF-8");
>>                 multipart.addBodyPart(textPart);
>>             }
>>
>>             if (htmlBody != null) {
>>                 MimeBodyPart htmlPart = new MimeBodyPart();
>>                 htmlPart.setContent(htmlBody, "text/html; charset=UTF-8");
>>                 multipart.addBodyPart(htmlPart);
>>             }
>>
>>             Message msg = new MimeMessage(session);
>>             msg.setFrom(new InternetAddress(from));
>>             msg.setHeader("To", address);
>>             msg.setSubject(subject);
>>             msg.setContent(multipart);
>>             msg.saveChanges();
>>             msg.setSentDate(new Date());
>>
>>             Transport transport = session.getTransport("smtp");
>>             if (auth) {
>>                 transport.connect(config.get("user"),
>> config.get("password"));
>>             } else {
>>                 transport.connect();
>>             }
>>             transport.sendMessage(msg, new InternetAddress[]{new
>> InternetAddress(address)});
>>         } catch (Exception e) {
>>             throw new EmailException(e);
>>         }
>>     }
>>
>> connect/auth
>>
>> JBWEB000309: type JBWEB000066: Exception report
>>
>> JBWEB000068: message request path:
>> /auth/realms/MYAPP/protocol/openid-connect/auth
>>
>> JBWEB000069: description JBWEB000145: The server encountered an internal
>> error that prevented it from fulfilling this request.
>>
>> JBWEB000070: exception
>>
>> java.lang.RuntimeException: request path:
>> /auth/realms/MYAPP/protocol/openid-connect/auth
>>
>> org.keycloak.services.filters.KeycloakSessionServletFilter.doFilter(KeycloakSessionServletFilter.java:75)
>> JBWEB000071: root cause
>>
>> org.jboss.resteasy.spi.UnhandledException:
>> java.lang.NoClassDefFoundError: javax/mail/Multipart
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:364)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:232)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:208)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:556)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:523)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:125)
>>
>> org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
>>
>> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
>>
>> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
>>     javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
>>
>> org.keycloak.services.filters.KeycloakSessionServletFilter.doFilter(KeycloakSessionServletFilter.java:61)
>> JBWEB000071: root cause
>>
>> java.lang.NoClassDefFoundError: javax/mail/Multipart
>>
>> de.MYAPP.auth.authenticator.MYAPPEmailAuthenticatorFactory.create(MYAPPEmailAuthenticatorFactory.java:27)
>>
>> de.MYAPP.auth.authenticator.MYAPPEmailAuthenticatorFactory.create(MYAPPEmailAuthenticatorFactory.java:19)
>>
>> org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:124)
>>
>> org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:97)
>>
>> org.keycloak.authentication.AuthenticationProcessor.authenticate(AuthenticationProcessor.java:650)
>>
>> org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.browserAuthentication(AuthorizationEndpoint.java:315)
>>
>> org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildAuthorizationCodeAuthorizationResponse(AuthorizationEndpoint.java:265)
>>
>> org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.build(AuthorizationEndpoint.java:123)
>>     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>>
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>     java.lang.reflect.Method.invoke(Method.java:606)
>>
>> org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:168)
>>
>> org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:269)
>>     org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:227)
>>
>> org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(ResourceLocator.java:158)
>>
>> org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:106)
>>
>> org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(ResourceLocator.java:153)
>>
>> org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:91)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:541)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:523)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:125)
>>
>> org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
>>
>> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
>>
>> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
>>     javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
>>
>> org.keycloak.services.filters.KeycloakSessionServletFilter.doFilter(KeycloakSessionServletFilter.java:61)
>> JBWEB000071: root cause
>>
>> java.lang.ClassNotFoundException: javax.mail.Multipart
>>     java.net.URLClassLoader$1.run(URLClassLoader.java:366)
>>     java.net.URLClassLoader$1.run(URLClassLoader.java:355)
>>     java.security.AccessController.doPrivileged(Native Method)
>>     java.net.URLClassLoader.findClass(URLClassLoader.java:354)
>>     java.lang.ClassLoader.loadClass(ClassLoader.java:425)
>>     java.lang.ClassLoader.loadClass(ClassLoader.java:358)
>>
>> de.MYAPP.auth.authenticator.MYAPPEmailAuthenticatorFactory.create(MYAPPEmailAuthenticatorFactory.java:27)
>>
>> de.MYAPP.auth.authenticator.MYAPPEmailAuthenticatorFactory.create(MYAPPEmailAuthenticatorFactory.java:19)
>>
>> org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:124)
>>
>> org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:97)
>>
>> org.keycloak.authentication.AuthenticationProcessor.authenticate(AuthenticationProcessor.java:650)
>>
>> org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.browserAuthentication(AuthorizationEndpoint.java:315)
>>
>> org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildAuthorizationCodeAuthorizationResponse(AuthorizationEndpoint.java:265)
>>
>> org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.build(AuthorizationEndpoint.java:123)
>>     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>>
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>     java.lang.reflect.Method.invoke(Method.java:606)
>>
>> org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:168)
>>
>> org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:269)
>>     org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:227)
>>
>> org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(ResourceLocator.java:158)
>>
>> org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:106)
>>
>> org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(ResourceLocator.java:153)
>>
>> org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:91)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:541)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:523)
>>
>> org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:125)
>>
>> org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
>>
>> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
>>
>> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
>>     javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
>>
>> org.keycloak.services.filters.KeycloakSessionServletFilter.doFilter(KeycloakSessionServletFilter.java:61)
>>
>> Am 23.11.15 um 13:32 schrieb Ataraxus:
>>
>> Hey,
>>
>> I'm writing my custum login provider which works great so far, but i
>> stumbled upon a dependency issue:
>> I wan't to use mail in my authenticator, but when the authenticator gets
>> actually loaded I get an class not found exception.
>> Somehow is java.mail.* not available in the classpath of providers which
>> are dropped in the configuration/providers path.
>> How can i use these dependencies? I could include them into my jar, but
>> i guess thats not the "right" way.
>>
>> Thanks
>> _______________________________________________
>> keycloak-user mailing listkeycloak-user at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/keycloak-user
>>
>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/keycloak-user/attachments/20151123/2a8722a6/attachment-0001.html 


More information about the keycloak-user mailing list