[keycloak-dev] Offline tokens - step 1

Marek Posolda mposolda at redhat.com
Mon Sep 21 08:06:34 EDT 2015


On 21/09/15 12:33, Stian Thorgersen wrote:
>
>
> On 21 September 2015 at 12:06, Marek Posolda <mposolda at redhat.com 
> <mailto:mposolda at redhat.com>> wrote:
>
>     I've sent the PR . Right now it works like this:
>
>     - ClientModel has flag "offlineTokensEnabled" . It's possible to
>     retrieve offline tokens just if flag is enabled
>
>     - Offline token is classic refresh token with 2 differences. It
>     has type
>     "OFFLINE" when normal refresh token has type "REFRESH" . And for
>     offline
>     token, the expiration value is 0, so it never expires.
>
>     - Offline token is generated by auth-server when client sends
>     "scope=offline_access" . It's supported for classic browser flow, but
>     also for Direct Grant flow or Service account flow.
>
>     - I've added OfflineClientSessionModel and OfflineUserSessionModel
>     with
>     CRUD methods on UserModel. So when new offline token is generated by
>     Keycloak, some info about current UserSession and ClientSession is
>     persisted on UserModel. This means that offline token can be used to
>     create new access token even if "normal" UserSession and ClientSession
>     are already invalid or logged out.
>
>     - When refreshing access token with offline token, the auth-server
>     won't
>     send back another refresh token. It will send just accessToken +
>     IDToken. This is to avoid writes to user database for each token
>     refresh.
>
>     - In account management applications tab, there is new table column
>     "Additional grants" where is shown if client has offline token for
>     user.
>     The click on "Revoke" button will remove offline tokens and granted
>     consents as well - no separate actions for revoke consents and offline
>     tokens.
>
>
>     Still TODO:
>     - Properly handle consents (see "Questions" below)
>
>     - More tests, example, export/import , docs
>
>     - More things/refactoring based on your feedback
>
>
>     Questions:
>     - The specs mentions that consent should be displayed when offline
>     token
>     is requested. See
>     http://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess .
>     Right now, I am not doing that. So when Client has "isConsentRequired"
>     as false, the consent screen is not displayed. Now we also don't have
>     support for "prompt=consent" (not sure if we need this) . Is it ok to
>     keep it like this?
>
>
> Wording is "MUST explicitly receive or have consent" - as the client 
> does not require consent (isConsentRequired=false) that implies the 
> client already has been given consent by the admin.
>
>
>     - I am thinking about adding new builtin client role "offline_access",
>     which will be created for client when admin enables "offline tokens"
>     switch. It will be used also as default role. This will allow that
>     just
>     some users are allowed to obtain offline-token (those which have this
>     role). The role will be also displayed on consent screen for the
>     clients, which needs consent.
>     But that raises another question. IMO it will be good if role is
>     requested and displayed on consent screen just if offline token is
>     requested, but not when classic refresh token is requested.
>
>
>     Hence I was thinking about adding the flag "scopeParamMode" to
>     RoleModel. The value true means that role will be requested and
>     used in
>     accessToken/refreshToken just if scope parameter contains it's value.
>     This will be the setup for "offline_access" role, so it's used
>     just for
>     the offline token requests. Another thing is format of scope parameter
>     with respect to realm roles and application roles. We can use "//" as
>     delimiter, so realm role will have just "my-role" but client role will
>     have "my-client//my-role" . The disadvantage is that for requesting
>     offline_access you will then need to use scope like:
>     "scope=customer-portal//offline_access" as it's client role.
>
>
> Spec says scope should be "offline_access", so if we use a different 
> name for it won't comply with the spec.
>
> Shouldn't the offline_access role be a realm role rather than a role 
> per-client?
The issue with realm role is, that user needs to confirm offline_access 
consent just once per all clients, which doesn't look correct to me.

For example there would be 2 clients "foo" and "bar":
- User john wants offline_access for client "foo"
- Consent screen is displayed with "offline_access" role and he confirms it
- Then user john wants offline_access for client "bar"
- There is no "offline_access" anymore on consent screen because john 
already has consent for realm role "offline_access" .


IMO it should be "offline_access" displayed again as it's different 
client. Also logically offline_access is granted per client, so the text 
on the grant screen is:

"has Offline Access in foo"

or

"has Offline Access in bar"

which will be with client roles.

>
> Another thing to consider is that we'll be moving to role namespaces 
> instead of realm/client roles soon. In that case we might want a 
> OpenID Connect namespace that can hold these scopes. So role could be 
> "openid/offline_access".
Ok. Maybe for now I won't do anything tricky but just limit the scope 
param support to client roles of current client. So scope 
"offline_access" is "offline_access" role of current client. We can 
improve it later once we add role namespaces support. WDYT?

Marek
>
>
>     WDYT? Any better idea?
>
>     Marek
>     _______________________________________________
>     keycloak-dev mailing list
>     keycloak-dev at lists.jboss.org <mailto:keycloak-dev at lists.jboss.org>
>     https://lists.jboss.org/mailman/listinfo/keycloak-dev
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/keycloak-dev/attachments/20150921/5c5796ab/attachment-0001.html 


More information about the keycloak-dev mailing list