. I will be working on it and
ask for help as needed to KC team.
On 2014-06-19, Bruno Oliveira wrote:
Good morning Stian, thanks for the feedback. I'm totally fine
with the
idea. I think we could start on keeping the backwards compatibility first and
implement the other items for UPS beta1.
On 2014-06-19, Stian Thorgersen wrote:
> Here's an idea on how it could be done (disclaimer: this is just a rough idea so
take it with a pinch of salt ;)). Some benefits:
>
> * Relatively simple to maintain backwards compatibility
> * Support public clients directly (by using logged in users permissions)
> * One application can access multiple UPS Apps
> * No need to maintain master secret in UPS (and can support multiple methods to auth
in the future, for example cert or jwt
> * Manage access through KC - what app/client or user can access what UPS App
>
>
> When creating a new UPS App create:
>
> * A role on unified-push-server - the name should be equal to id of UPS app
>
> Applications should have 3 options to authenticate:
>
> * As the logged in user (for client side applications)
> * As themselves (for server side applications)
> * HTTP Basic
>
> The master secret can also be removed from UPS App as it should no longer be
required.
>
> As the logged in user
> ---------------------
> This allows public applications to send push messages on behalf of the logged in
user. The steps required are:
>
> 1) Create an application/client in Keycloak
> * Set to public client
> * Add scope on UPS App role
> 2) Create user
> * Add role mapping on UPS App role
> 3) Users logs in with username/password, social, etc through KC login
> screens
> 4) Application can send push messages with bearer token using users
> permissions
>
> As themselves
> -------------
> This allows a server-side application to send push messages on behalf of itself. The
steps required are:
>
> 1) Create an application/client in Keycloak
> * Add scope on UPS App role
> 2) Create user
> * Add role mapping on UPS App role
> * Set a long unique password (equivalent of master secret)
> 3) Application logs in with username/password (equal to UPS App
> id/master-secret) using direct grant
> 4) Application can send push messages with bearer token using its own
> permissions
>
> In the future Keycloak will support additional mechanism for a server-side
application to authenticate on behalf of itself (cert, jwts, etc).
>
> HTTP Basic
> ----------
> For backwards compatibility we can add a valve that extracts the UPS App id and
master secret from Basic auth. It will then use the direct grant mechanism to obtain a
token from Keycloak. The steps required to configure is the same as "As
themselves".
>
>
>
> ----- Original Message -----
> > From: "Bruno Oliveira" <bruno(a)abstractj.org>
> > To: "AeroGear Developer Mailing List"
<aerogear-dev(a)lists.jboss.org>
> > Sent: Wednesday, 18 June, 2014 8:12:55 PM
> > Subject: Re: [aerogear-dev] Keycloak integration and UPS Sender
> >
> > Hi guys, let's see the result of the conversation with KC team and we
> > can revisit this discussion if some changed is required.
> >
> > On 2014-06-18, Matthias Wessendorf wrote:
> > > On Wed, Jun 18, 2014 at 12:12 AM, Bruno Oliveira
<bruno(a)abstractj.org>
> > > wrote:
> > >
> > > > Answers inline.
> > > >
> > > > On 2014-06-17, Matthias Wessendorf wrote:
> > > > > On Tue, Jun 17, 2014 at 8:51 PM, Matthias Wessendorf
> > > > > <matzew(a)apache.org>
> > > > > wrote:
> > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > On Tue, Jun 17, 2014 at 7:17 PM, Bruno Oliveira
<bruno(a)abstractj.org>
> > > > > > wrote:
> > > > > >
> > > > > >> Hi Matthias, answer inline.
> > > > > >>
> > > > > >> On 2014-06-17, Matthias Wessendorf wrote:
> > > > > >> > On Tue, Jun 17, 2014 at 4:26 PM, Bruno Oliveira
<
> > > > bruno(a)abstractj.org>
> > > > > >> wrote:
> > > > > >> >
> > > > > >> > > Good morning peeps,
> > > > > >> > >
> > > > > >> > > I have a problem to solve which might affect
the Sender and
> > > > > >> > > all the related clients.
> > > > > >> > >
> > > > > >> > > Previously, the UPS Sender was protected by
the basic
> > > > authentication
> > > > > >> > > method[1], so anyone in possession of
_PushApplicationID_ and
> > > > > >> > > _MasterSecret_ is able to send push
messages.
> > > > > >> > >
> > > > > >> > > After the integration with Keycloak now
everything under _/rest_
> > > > > >> > > is properly protect by KC which is totally
correct. Our sender
> > > > > >> > > is
> > > > > >> under
> > > > > >> > > the same umbrella which means that now Bearer
token
> > > > authentication is
> > > > > >> > > required[2] and Basic authentication
won't exist anymore.
> > > > > >> > >
> > > > > >> >
> > > > > >> >
> > > > > >> > The device (un)registration endpoints are hit by
this as well
> > > > > >> > (/rest/registry/device/*).
> > > > > >>
> > > > > >> Currently Keycloak is protecting our endpoints under
/rest/*
> > > > > >>
> > > > > >> >
> > > > > >> > I am wondering if it isn't it possible to keep
those URLs
> > > > > >> > protected
> > > > via
> > > > > >> > HTTP_BASIC, or does the keycloak.js usage deny
this?
> > > > > >>
> > > > > >> Is not the Keycloak.js usage responsible for this, but
the correct
> > > > > >> configuration of the application atm. Please compare:
> > > > > >>
> > > > > >> - master branch:
> > > > > >>
> > > > > >>
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/master/serve...
> > > > > >> - keycloak.js branch:
> > > > > >>
> > > > > >>
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/keycloak.js/...
> > > > > >>
> > > > > >> Now we're fully using Keycloak bearer tokens
instead of Basic.
> > > > > >>
> > > > > >
> > > > > >
> > > > > > Oh, I was following Bill's sample project, where he did
not use the
> > > > > > 'KEYCLOAK' auth-method:
> > > > > >
> > > > > >
> > > >
https://github.com/keycloak/keycloak/blob/master/project-integrations/aer...
> > > > > >
> > > > > > But we had the exclusion working w/ the KEYCLOAK
'auth-method', but
> > > > this
> > > > > > goes back to our initial starts in Dec/Jan.
> > > > > > Here is a rebased commit based on your initial commit:
> > > > > >
> > > > > >
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/2aabd073aaaa...
> > > > > >
> > > > > >
> > > > > >>
> > > > > >> >
> > > > > >> > On master (plain keycloak; before keycloak.js
usage) we are doing
> > > > > >> > an
> > > > > >> > exclude for those URLs:
> > > > > >> >
> > > > > >>
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/master/serve...
> > > > > >>
> > > > > >> I tried to include your exclusions, but that didn't
work for me.
> > > > > >>
> > > > > >> >
> > > > > >> >
> > > > > >> > IMO if possible, keeping these
'exceptions' (or excludes) under
> > > > > >> HTTP_BASIC
> > > > > >> > would be the simplest solution, as that means none
of our client
> > > > SDKs
> > > > > >> > (Android, iOS, Cordova, Node.js Sender,
Java-Sendet etc) would
> > > > require
> > > > > >> an
> > > > > >> > update.
> > > > > >>
> > > > > >> I had a chat with Stian and looks like it's
possible to support both
> > > > > >> auth methods in a single app, but that would involve
changes on
> > > > Keycloak.
> > > > > >> It's just the matter of discuss with KC team.
> > > > > >>
> > > > > >
> > > > > > I don't think we need to enable to <auth-method>
settings in our
> > > > web.xml;
> > > > > >
> > > >
> > > > How do you manage login/logout/current logged in user on Angular.js?
Is
> > > > possible to do on the server side, but how do you control it on the
> > > > client side?
> > > >
> > >
> > > Sure, to protect the admin-ui and most of the /rest/* endpoints we need
the
> > > one <auth-method>KEYCLOAK</auth-method>. No question there. I
was trying to
> > > say we do not need multiple 'auth-method' elements on web.xml
> > >
> > > But I think it should be possible to exclude a few URLs, like
'/rest/foo'
> > > and '/rest/bar', so that they are completely unprotected in terms
of
> > > Keycloak (e.g. via different security-constraint elements):
> > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/2aabd073aaaa...
> > >
> > > In terms of "current logged in user on Angular.js":
> > > * For the "/rest/sender" and
"/rest/device/registration" endpoints, I don't
> > > see a relationship to the user on Angular.js/AdminUI at all.
> > >
> > > Internally these 'unprotected' (or excluded) endpoints implement
the
> > > HTTP_BASIC scheme themselves:
> > > * They treat the Application/Variant like a 'user', by performing
a DB
> > > lookup of the give application/variantID
> > > * If that (Application or Variant) is found, the endpoints compare the
> > > given 'password' form the request w/ the "secret" on the
Application or
> > > Variant
> > >
> > > But for these endpoints (sender and device-registration) there is no real
> > > user here like "Mr. Jay" or "Push-Admin Foo".
> > >
> > > The client (registration or sender SDK) performs the auth, by applying
the
> > > ID and the secret:
> > > curl -3 -u "{PushApplicationID}:{MasterSecret}" ....
https://server
> > >
> > >
> > >
> > > >
> > > > >
> > > > > I mean: I think there is no need to enable multiple
<auth-method> args,
> > > > as
> > > > > we had the exclusion already working at some point, using their
> > > > > KEYCLOAK
> > > > > auth-method
> > > >
> > > > Stian did that inclusion which for me looks correct. An excerpt from
KC
> > > > documentation:
> > > >
> > > > "To be able to secure WAR apps deployed on JBoss AS 7.1.1, JBoss
EAP 6.x,
> > > > or Wildfly, you must install and configure the Keycloak Subsystem.
You
> > > > then have two options to secure your WARs. You can provide a
keycloak
> > > > config file in your WAR and change the auth-method to KEYCLOAK
within
> > > > web.xml. Alternatively, you don't have to crack open your WARs at
all
> > > > and can apply Keycloak via the Keycloak Subsystem configuration in
> > > > standalone.xml. Both methods are described in this section."
> > > >
> > > > You can also stick with BASIC, but probably you end with
implementations
> > > > and customizations that don't take any benefit of Keycloak.js.
> > > >
> > > > Either way I will talk tomorrow with Stian and let's see what we
can do.
> > > >
> > > > >
> > > > >
> > > > >
> > > > > >
> > > > > > My initial hope was to be able to simply exclude a few URLs
from the
> > > > > > overall Keycloak protection, like the above referenced
commit:
> > > > > >
> > > > > >
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/2aabd073aaaa...
> > > > > >
> > > > > > That would be best as that would mean no API change at all,
and our
> > > > > > client-registration and sender SDKs could stay as they
are.
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >>
> > > > > >> My two cents is the fact that we should use bearer
tokens only,
> > > > instead
> > > > > >> of mix both auth methods in a single app — now that we
have KC.
> > > > > >> And discuss the changes into our clients rather sooner
than later.
> > > > > >>
> > > > > >> But I'm open for whatever you guys think it's
the best.
> > > > > >>
> > > > > >>
> > > > > >> >
> > > > > >> > -Matthias
> > > > > >> >
> > > > > >> >
> > > > > >> >
> > > > > >> >
> > > > > >> >
> > > > > >> > >
> > > > > >> > > The consequence of this is the basic form
being presented when
> > > > you try
> > > > > >> > > to send push notifications[3]. The problem
didn't occur before,
> > > > > >> because
> > > > > >> > > we were just using Basic authentication[4]
instead of Bearer
> > > > tokens.
> > > > > >> > >
> > > > > >> > > Possible solutions:
> > > > > >> > >
> > > > > >> > > 1- After the removal of Basic authentication,
move
> > > > _PushApplicationID_
> > > > > >> > > and _MasterSecret to http headers like:
> > > > > >> > >
> > > > > >> > > -H "PushApplicationID: XXXXXX" -H
"MasterSecret: 42"
> > > > > >> > >
> > > > > >> > > IMO it sounds correct and reasonable for me.
> > > > > >> > >
> > > > > >> > > 2. Create a role specific for the sender
like
> > > > > >> > > _push-applications_
> > > > and
> > > > > >> > > dinamically add _PushApplicationID_ and
_MasterSecret on
> > > > > >> > > Keycloak
> > > > > >> where:
> > > > > >> > >
> > > > > >> > > username: _PushApplicationID_
> > > > > >> > > password: _MasterSecret_
> > > > > >> > >
> > > > > >> > > The implications of this alternative is the
fact of have to
> > > > > >> > > manage
> > > > > >> those
> > > > > >> > > credentials on the server side
inclusion/exclusion/login
> > > > > >> > >
> > > > > >> > > 3. Implement another authentication provider
specifically for
> > > > > >> > > the
> > > > > >> sender
> > > > > >> > > and Basic authentication[5]
> > > > > >> > >
> > > > > >> > > 4. Do nothing. The consequences of this
alternative is to
> > > > implement
> > > > > >> > > everything already done by Keycloak.js and
manage session tokens
> > > > by
> > > > > >> hand
> > > > > >> > > on the admin-ui.
> > > > > >> > >
> > > > > >> > > To me the first alternative seems to be more
simple, but I
> > > > > >> > > really
> > > > want
> > > > > >> > > your feedback on it, once it affects the
whole project.
> > > > > >> > >
> > > > > >> > > [1] -
> > > > > >> > >
> > > > > >> > >
> > > > > >>
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/6c1a0d3fedea...
> > > > > >> > >
> > > > > >> > > [2] -
> > > > > >> > >
> > > > > >>
> > > >
https://github.com/abstractj/aerogear-unifiedpush-server/tree/keycloak.js
> > > > > >> > > [3] -
> > > > > >> > >
> > > > > >> > >
> > > > > >>
> > > >
http://photon.abstractj.org/AeroGear_UnifiedPush_Server_2014-06-17_10-00-...
> > > > > >> > >
> > > > > >> > > [4] -
> > > > > >> > >
> > > > > >> > >
> > > > > >>
> > > >
https://github.com/aerogear/aerogear-unifiedpush-server/blob/master/serve...
> > > > > >> > >
> > > > > >> > > [5] -
> > > > > >> > >
> > > > > >>
> > > >
https://github.com/keycloak/keycloak/tree/master/examples/providers/authe...
> > > > > >> > >
> > > > > >> > > --
> > > > > >> > >
> > > > > >> > > abstractj
> > > > > >> > >
_______________________________________________
> > > > > >> > > aerogear-dev mailing list
> > > > > >> > > aerogear-dev(a)lists.jboss.org
> > > > > >> > >
https://lists.jboss.org/mailman/listinfo/aerogear-dev
> > > > > >> > >
> > > > > >> >
> > > > > >> >
> > > > > >> >
> > > > > >> > --
> > > > > >> > Matthias Wessendorf
> > > > > >> >
> > > > > >> > blog:
http://matthiaswessendorf.wordpress.com/
> > > > > >> > sessions:
http://www.slideshare.net/mwessendorf
> > > > > >> > twitter:
http://twitter.com/mwessendorf
> > > > > >>
> > > > > >> > _______________________________________________
> > > > > >> > aerogear-dev mailing list
> > > > > >> > aerogear-dev(a)lists.jboss.org
> > > > > >> >
https://lists.jboss.org/mailman/listinfo/aerogear-dev
> > > > > >>
> > > > > >>
> > > > > >> --
> > > > > >>
> > > > > >> abstractj
> > > > > >> _______________________________________________
> > > > > >> aerogear-dev mailing list
> > > > > >> aerogear-dev(a)lists.jboss.org
> > > > > >>
https://lists.jboss.org/mailman/listinfo/aerogear-dev
> > > > > >>
> > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Matthias Wessendorf
> > > > > >
> > > > > > blog:
http://matthiaswessendorf.wordpress.com/
> > > > > > sessions:
http://www.slideshare.net/mwessendorf
> > > > > > twitter:
http://twitter.com/mwessendorf
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Matthias Wessendorf
> > > > >
> > > > > blog:
http://matthiaswessendorf.wordpress.com/
> > > > > sessions:
http://www.slideshare.net/mwessendorf
> > > > > twitter:
http://twitter.com/mwessendorf
> > > >
> > > > > _______________________________________________
> > > > > aerogear-dev mailing list
> > > > > aerogear-dev(a)lists.jboss.org
> > > > >
https://lists.jboss.org/mailman/listinfo/aerogear-dev
> > > >
> > > >
> > > > --
> > > >
> > > > abstractj
> > > > _______________________________________________
> > > > aerogear-dev mailing list
> > > > aerogear-dev(a)lists.jboss.org
> > > >
https://lists.jboss.org/mailman/listinfo/aerogear-dev
> > > >
> > >
> > >
> > >
> > > --
> > > Matthias Wessendorf
> > >
> > > blog:
http://matthiaswessendorf.wordpress.com/
> > > sessions:
http://www.slideshare.net/mwessendorf
> > > twitter:
http://twitter.com/mwessendorf
> >
> > > _______________________________________________
> > > aerogear-dev mailing list
> > > aerogear-dev(a)lists.jboss.org
> > >
https://lists.jboss.org/mailman/listinfo/aerogear-dev
> >
> >
> > --
> >
> > abstractj
> > _______________________________________________
> > aerogear-dev mailing list
> > aerogear-dev(a)lists.jboss.org
> >
https://lists.jboss.org/mailman/listinfo/aerogear-dev
>
> _______________________________________________
> aerogear-dev mailing list
> aerogear-dev(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/aerogear-dev
--
abstractj