03-02-2020 / blog / Jeroen van de Lockand

API's beveiligen met keycloak autorisatie

In dit Blog laat ik zien hoe Quarkus applicatie endpoints met Keycloak Authorization Services beveiligd zijn.

 

De volledige applicatie is te vinden op de Conclusion Xforce Gitlab pagina hier.

Clone deze repository en volg de instructies die beschreven zijn in dit Blog.

 

Wat heb je nodig:

  • 15 minuten

  • JDK 1.8+ is geinstalleerd en JAVA_HOME is correct geconfigureerd

  • Apache Maven 3.5.3+

  • jq tool

  • Docker

 

Keycloak

Keycloak is een Open Source Identity and Access Management systeem, waarmee authenticatie toegevoegd kan worden aan applicaties en services zonder gedoe!

 

Wil je meer lezen over Keycloak bekijk dan de documentatie.

 

Start Keycloak

Om een een ander makkelijker te maken is er een Keycloak container image beschikbaar gemaakt. In deze container wordt een Quarkus Realm geïmporteerd tijdens het starten van de container.

 

docker run --rm --name keycloak \
  -e KEYCLOAK_USER=admin \
  -e KEYCLOAK_PASSWORD=admin \
  -e KEYCLOAK_IMPORT=/opt/app-root/quarkus-realm.json \
  -p 8180:8080 \
  registry.gitlab.com/conclusionxforce/container/quarkus-keycloak

 

Als de Keycloak server gestart is kun je een kijkje nemen in de admin console hier. Inloggen doe je met de user en password die bovenstaande gezet is.

Applicatie

Dit voorbeeld is een eenvoudige Java applicatie met twee endpoints.

  • /api/users/me

  • /api/admin

 

Deze beide endpoints zijn beveiligd en geven alleen toegang wanneer een client een Bearer Token meestuurt in de header van het request.

 

Bearer Authenticatie

Bearer-authenticatie (ook wel token-authenticatie genoemd) is een HTTP-authenticatieschema dat beveiligingstokens gebruikt en wordt uitgelegd als:

The name “Bearer authentication” can be understood as “give access to the bearer of this token.”. Het Bearer Token is een string en wordt in dit geval uitgegeven door de Keycloak server.

 

Endpoints

Het /api/users/me endpoint kan door iedereen met een valide token benaderd worden. Als response krijg je een JSON document met de gebruikersnaam van het token.

Het endpoint is verder geconfigureerd met RBAC (Role-Based Access Control) en alleen gebruikers met de rol "user" krijgen toegang.

 

Het /api/admin endpoint is beveiligd met RBAC (Role-Based Access Control) en alleen gebruikers met de rol "admin" krijgen toegang.

 

Wil je zelf aan de slag met de code kijk dan naar de volgende handleiding.

 

Start de applicatie

./mvnw quarkus:dev

Testen!

Als de Keycloak server is opgestart en de applicatie beschikbaar is, kunnen we kijken hoe dit werkt.

 

Onderstaande requests kunnen ook gedaan worden met browser plugins als RESTED, Advanced REST client, of Postman. Zelf geef ik de voorkeur aan de commandline.

 

Het token dient eerst opgehaald te worden bij de Keycloak server.

 

export access_token=$(\

  curl -s -X POST http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/token \

  --user backend-service:secret \

  -H 'content-type: application/x-www-form-urlencoded' \

  -d 'username=alice&password=alice&grant_type=password' | jq --raw-output '.access_token' \ ) | echo $access_token

 

In bovenstaand voorbeeld halen we het token voor de gebruiker alice op.

 

Probeer nu het volgende endpoint te benaderen.

curl -v -X GET \ http://localhost:8080/api/users/me \

  -H "Authorization: Bearer "$access_token

 

In de header van het verzoek wordt de "Authorization: Bearer "$access_token" meegestuurd.

 

Probeer ook het /api/admin endpoint. Als het goed is krijg je een 403 response code van de server.

curl -v -X GET \ http://localhost:8080/api/admin \

  -H "Authorization: Bearer "$access_token

 

Om toegang te krijgen tot het admin endpoint dient eerst een nieuw token opgehaald te worden.

 

export access_token=$(\

  curl -s -X POST http://localhost:8180/auth/realms/quarkus/protocol/openid-connect/token \

  --user backend-service:secret \

   -H 'content-type: application/x-www-form-urlencoded' \

  -d 'username=admin&password=admin&grant_type=password' | jq --raw-output '.access_token' \ ) | echo $access_token

 

Probeer nu nogmaals het /api/admin endpoint. Als het goed is krijg je een 200 response code van de server.

curl -v -X GET \ http://localhost:8080/api/admin \

  -H "Authorization: Bearer "$access_token

Evenement

Op 25 Maart organiseren ConclusionXforce en First8 | Conclusion, een unieke hands-on praktijkdag over het Containeriseren van Java applicaties (met Quarkus op OpenShift).

 

Tijdens deze workshop ga jij onder andere ook aan de slag met Quarkus en Keycloak en bouw je een web applicatie met Qarkus in een Eclipce Che cloud development omgeving. Je gaat stapsgewijs de web applicatie uitbreiden met:

  • Dependency Injection
  • Testing Quarkus Apps
  • Debugging Quarkus Apps
  • Building Native Quarkus Apps
  • Developing Cloud Native with Quarkus
  • Using Quarkus extensions
  • Hibernate ORM with Panache
  • Event-driven Messaging
  • Streaming Data with Quarkus and Kafka
  • Monitoring with Prometheus and Grafana
  • Tracing Quarkus Apps with Jaeger and MicroProfile Tracing
  • Secure Quarkus applications with Microprofile JSON Web Token (JWT) RBAC, Keycloak and OAuth

 

De workshop is met name interessant voor ontwikkelaars/architecten die geïnteresseerd zijn in het ontwikkelen van microservices die afgestemd zijn op cloud omgevingen.

 

Handig om te weten:

Neem je eigen laptop mee, er hoeft van tevoren niets geïnstalleerd te worden.

 


Deelname is kosteloos, maar het aantal plaatsen is beperkt. Meld je hier snel aan.