[keycloak-user] Client scopes not checked?

Matthias Kesternich matthias.kesternich at moneymeets.com
Fri Jun 22 07:15:45 EDT 2018


Hi Marek,



thanks again for your answer.

  

>    One more note: Access token already contains the roles available to user 

>    by default. You can see claims "realm-access" and "resource-access" 

>    inside access token. Which you can doublecheck in "Evaluate" tab of 

>    client. Right now, we're adding those claims "realm-access" and 

>    "resource-access" into the token automatically, but we want to add 

>    protocolMapper to add them just "on demand" .

   

I have gone further now and used the script mapper below. It takes the

information from "resource-access" and copies each role to the "scope" claim.

I think this is ok, because the "scope" claim in the access token does not mean

"client scope" anymore, but "rights associated with this token". This seems to

be supported by RFC 6749, sections 3.3. and 10.3.

This is also the very same thing Auth0 does:

https://auth0.com/docs/architecture-scenarios/spa-api/part-2#create-a-rule-to-validate-token-scopes .



Something like this might be useful as a builtin mapper I think. When looking

at other people's solutions to the problem of creating a scope restricted by

user permissions this mapper would have solved their problems.



var scopes = token.scope.split(" ");

var resourceAccess = token.getResourceAccess();

for (var resourceKey in resourceAccess) {

  var roles = resourceAccess[resourceKey].getRoles().toArray();

  for (var i = 0; i < roles.length; i++) {

    scopes.push(resourceKey + ":" + roles[i]);

  }

}

scopes.join(" ");



The only downside to this is that "roles"/"client roles" in the UI are really

something like "permissions"/"scopes" now.



On a sidenote I also had to write a mapper like this to get multiple audiences

into my access token:



var aud = java.lang.reflect.Array.newInstance(java.lang.String.class, 3);

aud[0] = "client0";

aud[1] = "client1";

aud[2] = "client2";

aud;



This was necessary, because I couldn't really find any libraries that support

token exchange. "client0" actually requests the token, but it does not only

use this token for itself, but also to call "client1" and "client2".



Best,

-Matthias





More information about the keycloak-user mailing list