This extension provides a custom mapper which overrides the default "scope" access token JWT claim.
The mapper takes the following "scope" value:
"scope": "foo bar"
And transforms it into Array type:
"scope": ["foo", "bar"]
If you have Docker daemon running on your machine, you can just run KeycloakDevRunner.
It will launch pre-configured Keycloak instance in a temporary Docker container with the following client credentials:
- Client ID: testclient
- Client Secret: testclient
You can use these credentials to authenticate using client credentials grant type and check scopes JWT claim to verify that the mapper is working as expected.
curl --request POST --data 'grant_type=client_credentials&client_id=testclient&client_secret=testclient' http://localhost:8180/realms/test/protocol/openid-connect/token
![Screenshot 2023-07-13 at 12 21 10](https://private-user-images.githubusercontent.com/1240012/253233226-0ecec47c-a7a3-4ea2-96fd-3728fc12788b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEwNTIzNzksIm5iZiI6MTcyMTA1MjA3OSwicGF0aCI6Ii8xMjQwMDEyLzI1MzIzMzIyNi0wZWNlYzQ3Yy1hN2EzLTRlYTItOTZmZC0zNzI4ZmMxMjc4OGIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcxNSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MTVUMTQwMTE5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ODI4OTVlYWY5YzMxNzBmOTQ3YmRlZjZmNWYxMzM0ZDVjZTliYTBiNjdmZGYzZDY5MjdmYjcxMWQ3Y2VjYjUxNiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.hMd2MnUQ-G2-2uOGonDJire9ydvRvN5lYO5_SotUHtI)
To build the extension, just run the following command:
./gradlew jar
Then copy resulting JAR file to your Keycloak's providers directory.
cp build/libs/keycloak-custom-scopes-extension-1.0.jar KEYCLOAK_ROOT/providers
Now you can run your Keycloak instance. The custom mapper should appear in available client mappers.
![Screenshot 2023-07-13 at 12 24 16](https://private-user-images.githubusercontent.com/1240012/253230970-917320ca-15b6-4360-9f7a-87536e185293.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEwNTIzNzksIm5iZiI6MTcyMTA1MjA3OSwicGF0aCI6Ii8xMjQwMDEyLzI1MzIzMDk3MC05MTczMjBjYS0xNWI2LTQzNjAtOWY3YS04NzUzNmUxODUyOTMucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcxNSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MTVUMTQwMTE5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MmRhY2VkMjQ0MDlmOGJhMWMwODM5YTRlNzU5NGFkZTBjNjA2YTYwNmJjNDg2MTkyZjY2MmU3ZDMyMzAyZWY3NiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.v3kV_NgYquFQKssTToWNHfvc8-5TNaJK-sfaFNgudxc)
![Screenshot 2023-07-13 at 12 24 56](https://private-user-images.githubusercontent.com/1240012/253231307-53a65f6a-1827-4592-97c2-28b0170951c2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEwNTIzNzksIm5iZiI6MTcyMTA1MjA3OSwicGF0aCI6Ii8xMjQwMDEyLzI1MzIzMTMwNy01M2E2NWY2YS0xODI3LTQ1OTItOTdjMi0yOGIwMTcwOTUxYzIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcxNSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MTVUMTQwMTE5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZTcwNmYxM2I5MWRkZGU3MTZhMWVjY2ExNzdkYWNjNDZhOGRmZDg0MTVkNmQ1MDhlNGU3YTY4N2VjM2JhZjIxYiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.S_QvTaF9OzmRkrB4aByiG6i_u21s0j9QGWRkD642fa8)
![Screenshot 2023-07-13 at 12 25 08](https://private-user-images.githubusercontent.com/1240012/253231020-25d6829a-6678-4054-aac8-2ee95da5e1d5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEwNTIzNzksIm5iZiI6MTcyMTA1MjA3OSwicGF0aCI6Ii8xMjQwMDEyLzI1MzIzMTAyMC0yNWQ2ODI5YS02Njc4LTQwNTQtYWFjOC0yZWU5NWRhNWUxZDUucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcxNSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MTVUMTQwMTE5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZjIwMjZiNGEwMzMwZGRmYWM0ZjUxNjA4ZTg3M2JiYWU0ZGQ1NDlhOGRmZWQxNDMzZTAwNjljNjlkODhmODYxOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.lQbGRGDBuQy1hxO2wPbQmWh2VDwnNlcYL7anE-pEvyI)