[keycloak-dev] Keycloak servlet filter adapter on OSGi, first impressions
Dmitry Telegin
dt at acutus.pro
Thu Jul 12 20:24:01 EDT 2018
Hi Hynek,
Thanks for the OSGi fragment tip, it worked perfectly. Also glad to
hear the HTTP Components dependency issue has been resolved.
So OK for JIRA/PR for servlet filter adapter OSGi bundling? And, by the
way, should we document how to use this adapter on OSGi? Installing a
bundle is not sufficient, the filter should be registered with OSGi
HTTP Service, and there are at least two ways of doing it (via
BundleContext::registerService or via a @Component that extends the
filter class). What do you think?
Dmitry
On Thu, 2018-07-12 at 11:10 +0200, Hynek Mlnarik wrote:
> Hi Dmitri,
> thank you for the updates.
>
> The 1. (dependencies on Apache HTTP Components) has been resolved in
> the latest master already and the -thirdparty module has been
> removed. Hopefully this addresses your concerns completely.
>
> Ad 2. we have taken approach with OSGi fragment when resolving
> similar situation with server-specific implementation, see e.g. [1].
> This is preferrable to moving classes to different packages. Could
> you take this approach?
>
> [1] https://github.com/keycloak/keycloak/blob/master/adapters/spi/und
> ertow-adapter-spi/pom.xml#L119
>
> On Wed, Jul 11, 2018 at 7:36 PM Dmitry Telegin <dt at acutus.pro> wrote:
> > Hi,
> >
> >
> >
> > We are working on integrating Apache Sling with Keycloak (see my
> >
> > posting from June 12). It was suggested that we'd stick to servlet
> >
> > filter adapter as the most generic one (unlike Keycloak OSGi
> >
> > adapter which is more of a JBoss Fuse adapter).
> >
> >
> >
> > The first step was to convert keycloak-servlet-filter-adapter and
> >
> > required keycloak-servlet-adapter-spi to OSGi bundles. This went
> > OK,
> >
> > I've just added OSGi bundling to the respective POMs. However there
> >
> > were two major issues when deploying and running the code:
> >
> >
> >
> > 1. Bogus dependency on org.apache.http.*
> >
> >
> >
> > Several Keycloak modules the adapter depends on, namely keycloak-
> > authz-client and keycloak-adapter-core, declare bogus "Import-
> > Package: org.apache.http.*;version=4.5.2" dependency.
> >
> >
> >
> > This comes from the following lines in the POM:
> >
> >
> >
> > <keycloak.osgi.import>
> >
> > org.keycloak.*;version="${project.version}",
> >
> >
> > org.apache.http.*;version=${apache.httpcomponents.version},
> >
> > ...
> >
> > </keycloak.osgi.import>
> >
> >
> >
> > org.apache.http.* is exported by
> > org.apache.httpcomponents:httpcore-osgi, which uses its own
> > versioning scheme (4.4.9 is the latest version ATM). Thus,
> > deploying the bundle to OSGi runtime fails due to unsatisfied
> > dependency.
> >
> >
> >
> > Later, I've discovered there's keycloak-osgi-thirdparty bundle that
> > provides required dependencies (however, they don't become less
> > bogus because of that).
> >
> >
> >
> > I'm OK with this workaround, but generally speaking, is keycloak-
> > osgi-thirdparty still needed?
> >
> > I've got an impression it was created at a time when not every
> > dependency was available as OSGi bundle.
> >
> >
> >
> > Current version of keycloak-osgi-thirdparty contains merged
> > httpclient and httpcore, which are available as
> > org.apache.httpcomponents:httpclient-osgi and
> > org.apache.httpcomponents:httpcore-osgi, respectively.
> >
> >
> >
> > So to me it seems like a candidate for deprecation and removal. If
> > so, the bogus dependency issue, obviously, should be tackled with
> > first.
> >
> >
> >
> > 2. Split package org.keycloak.adapters.servlet
> >
> >
> >
> > > In standard Java programming, packages are generally treated as
> >
> > > split; the Java class path approach merges all packages from
> >
> > > different JAR files on the class path into one big soup. This is
> >
> > > anathema to OSGi’s modularization model, where packages are
> > treated
> >
> > > as atomic (that is, they can’t be split).
> >
> >
> >
> > http://web.ist.utl.pt/ist162500/?p=65
> >
> >
> >
> > In Keycloak, the package org.keycloak.adapters.servlet is split
> > between
> >
> > keycloak-servlet-adapter-spi and keycloak-servlet-filter-adapter.
> > This
> >
> > leads to seemingly inexplicable NoClassDefFoundError's, when e.g.
> >
> > KeycloakOIDCFilter cannot find its neighbor OIDCServletHttpFacade.
> > The
> >
> > recipe provided by the above article (create dummy bundle, prohibit
> >
> > direct imports etc.) is rather cumbersome, so I've just created
> >
> > org.keycloak.adapters.servlet.spi package and moved there the two
> >
> > classes from keycloak-servlet-adapter-spi.
> >
> >
> >
> > After that, I was finally able to wire Keycloak filter to a test
> >
> > servlet, and it worked pretty well. There was a redirect to
> > Keycloak's
> >
> > login screen, then redirect back, and the servlet was able to
> > obtain
> >
> > valid KeycloakPrincipal with JWT token.
> >
> >
> >
> > To sum up, I'm eager to contribute changes required to make
> > Keycloak
> >
> > servlet filter adapter a valid and working OSGi bundle. That would
> >
> > include OSGi bundling for two modules and split package
> > refactoring.
> >
> > The first issue (bogus deps) IMO should require further discussion.
> >
> >
> >
> > Let me know what you think,
> >
> >
> >
> > Dmitry Telegin
> >
> > CTO, Acutus s.r.o.
> >
> > _______________________________________________
> >
> > keycloak-dev mailing list
> >
> > keycloak-dev at lists.jboss.org
> >
> > https://lists.jboss.org/mailman/listinfo/keycloak-dev
More information about the keycloak-dev
mailing list