Non le titre n’est pas aguicheur. Par défaut, Keycloak autorise bien l’émission de tokens sans aucune limite de validité, permettant à un attaquant de persister dans votre application !
Si vous utilisez Keycloak au quotidien, vous avez peut-être du voir passer le terme ”offline access” sans vraiment saisir en détail ce concept.
L’offline access (ou offline token) est un type spécial de refresh token défini dans la spécification OIDC. Contrairement à un refresh token classique, il permet d’obtenir de nouveaux access tokens même lorsque l’utilisateur n’est plus connecté. C’est notamment utile pour des actions “hors ligne”, comme des sauvegardes automatiques exécutées sans interaction de l’utilisateur.
C’est un peu un 🪄 super refresh token, qui ne dépend pas de la session active de l’utilisateur et reste valide même après la déconnexion.
Première étape lors de l’authentification, au lieu de demander de manière classique l'émission d’un couple (access token, refresh token), précisons dans le scope que nous souhaitons un offline_access :
curl --location '<https://keycloak.example.com/realms/master/protocol/openid-connect/token>' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=example' \
--data-urlencode 'grant_type=password' \
--data-urlencode '[email protected]' \
--data-urlencode 'password=examplePassword' \
--data-urlencode 'scope=openid offline_access' # <- offline_access !
Vous êtes désormais l’heureux détenteur d’un refresh token sans limite de durée (félicitations !)

Vous pouvez désormais l’utiliser autant de fois que vous le souhaitez pour générer de nouveaux access tokens valides sur votre application, même une fois l’utilisateur déconnecté :
curl --location '<https://keycloak.example.com/realms/master/protocol/openid-connect/token>' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=example' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'refresh_token=eyJ...' # <- votre refresh_token
À noter que les access tokens issus d’un offline token sont quasi identiques à ceux issus d’un refresh token classique, et seront valides dans la plupart des cas.