[keycloak-dev] Initial client scopes PR
Marek Posolda
mposolda at redhat.com
Wed Mar 14 13:46:41 EDT 2018
Hi,
I've finally send PR https://github.com/keycloak/keycloak/pull/5076 for
the first iteration of client scopes. I will talk on tomorrow call about
the details and still need to write some more automated tests. But I am
seing PR now if someone wants to take a look.
Summary:
- Client Templates were renamed to "Client Scopes". Some things were
removed from the client template admin console (EG. Theme setting added
recently). Also I've removed some ClientTemplate model properties, which
were never used. Client Scope still has list of protocol mappers and
list of "Scopes" (Roles scope mappings).
- There is new tab "Client Scopes" on client. Here you can assign client
scopes to client. Each client has 2 types of client scopes:
-- Default client scopes -- Those client scopes are automatically
applied when login with the client. Their protocol mappers and "Role
scope mappings" are always used.
-- Optional client scopes -- Those client scopes are applicable just for
OIDC clients. They are used just if they are requested by "scope"
parameter during login
- Under "Client scopes", there is new tab "Default Client Scopes" . This
allows to specify "Realm default client scopes" and "Realm optional
client scopes". The scopes configured here will be added as
default/optional scopes to new clients. Client can override this (Remove
those defaults and add some different client scopes). So it works
similarly to Default Roles.
- Roles don't have "Scope Param Required" flag anymore. Protocol mappers
don't have "Consent required" and "Consent text" anymore. Client scopes
don't have "Full scope allowed" flag. But clients still have "Full scope
allowed" flag for now and it's still ON by default for newly created
clients.
- There are few builtin client scopes added to each realm. There are 4
claims scopes defined in OIDC specification and those are added by
default: "profile", "email", "address" and "phone" with the protocol
mappers corresponding to the claims described in OIDC specification [1].
-- The "profile" and "email" are configured as default scopes and hence
are automatically added to new clients.
-- The "phone" and "address" are configured as optional scopes by default.
-- The clients now doesn't have any protocolMappers added by default
when they are created. I've added "profile" and "email" as default
scopes due it's most close to the previous default protocolMappers we had.
- For SAML, there is "role_list" default client scope, containing just 1
protocol mapper "role list". So both OIDC and SAML clients don't have
any protocol mappers by default, it's driven by client scopes now by
default.
- There is "offline_access" OIDC client scope, which is optional scope
by default. This scope contains just "offline_access" realm role. Due
the fact, that parameter "Scope Param Required" was removed from
RoleModel, the "offline_access" role is now automatically available in
tokens for clients with "Full Scope Allowed", even if no offline tokens
was requsted. But I don't think it's big issue besides a bit bigger
token. Same also already applies for uma_authorization and some other
built-in roles. The fact, that offline token is requested is now driven
by "offline_access" scope. But user should still have "offline_access"
role to be able to receive offline token.
Consent changes:
- Consent screen now doesn't display protocolMappers (claims) and roles,
but instead it displays just client scopes. So by default, the consent
screen contains 2 items "User profile" and "Email address", which
correspond to the "profile" and "email" OIDC scopes.
- There can be still the case, when client has some protocolMappers or
role scope mappings defined on itself. So I've added flag "Display On
Consent Screen" on clients (It's OFF by default) to specify if some
message should be shown on consent screen about claims dedicated
directly to client itself. It's useful especially when client doesn't
have any client scopes as the consent screen wouldn't be displayed in
that case.
- During this refactoring, I've tried to do some cleanup we discussed
before, so I've removed protocolMappers and roles from clientSession.
Instead I've added clientScopes to refresh token. During refreshing
token, it's checked that user still has all the consents, which are in
the refresh token. So in case that user revoked consents in the
meantime, the token refresh will fail. ProtocolMappers and scoped roles
are always re-computed from the clientScopes. So if for example another
claim was added to scope "profile", it will automatically be applied
after refreshed token. I don't see an issue with that. User approved on
consent screen scope "profile" and he may not be concerned what
claims/scoped roles are in profile.
- Migration: In the end I did not change existing clients and did not
remove protocolMappers from them and didn't add default/optional client
scopes to them. The only exception is "offline_access" profile, which is
added as optional to all clients, which had scope to "offline_access"
role. Consents are not migrated - again with the only exception being
"offline_access" consent, so refreshing offline tokens from previous
version still works. The new consent screen is something quite different
than previous one, so makes sense to show it to users again when they
want to login, even if they approved protocolMappers for the previous
version.
Sorry for long email and long PR :) More tomorrow...
[1] http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
Marek
More information about the keycloak-dev
mailing list