Token lifecycle v Kramerius UI
Frontend aplikace Krameria používají:
- access token
- refresh token
pro správu autentizace uživatele.
Backend Krameria je stateless a neudržuje server-side session.
Veškerá práce s expirací tokenů probíhá na straně frontend aplikace.
Login flow
Po úspěšném přihlášení získá frontend:
- access_token
- refresh_token
- expires_in
- refresh_expires_in
Typická odpověď:
{ "access_token": "...", "expires_in": 300, "refresh_token": "...", "refresh_expires_in": 1800 }
Frontend uloží:
- access token
- refresh token
- čas expirace access tokenu
- čas expirace refresh tokenu
Uložení expirace
Frontend vypočítává:
- access_token_expiry = now + expires_in
- refresh_token_expiry = now + refresh_expires_in
Tyto hodnoty slouží pro rozhodování o refresh flow.
Běžné API requesty
Každý request na backend obsahuje:
Authorization: Bearer access_token
Backend:
- validuje JWT token
- nevytváří session
- neprovádí refresh tokenů
Expirace access tokenu
Pokud access token expiroval:
- frontend nesmí request odeslat
- frontend musí nejprve provést refresh
Flow:
- Angular zjistí expiraci access tokenu
- frontend zavolá
/auth/refresh - odešle refresh token
- získá nový access token
- opakuje původní request
Expirace refresh tokenu
Pokud expiroval refresh token:
- frontend nesmí volat
/auth/refresh - frontend nesmí posílat requesty na backend
Uživatel musí provést nové přihlášení.
Flow:
- Angular zjistí expiraci refresh tokenu
- frontend provede redirect na login
- uživatel se znovu autentizuje
Doporučená rozhodovací logika
Před každým requestem:
-
pokud je access token validní
- odeslat request
-
pokud access token expiroval, ale refresh token je validní
- provést refresh
- opakovat request
-
pokud expiroval i refresh token
- redirect na login
Refresh token rotation
Refresh operace může vrátit:
- nový access token
- nový refresh token
Frontend musí vždy:
- přepsat refresh token
- přepsat refresh token expiry
Sliding vs fixed expiration
Chování refresh tokenu závisí na konfiguraci Keycloak.
Refresh token může být:
- fixed expiration
- sliding expiration
Tato konfigurace je součástí Keycloak realm nastavení.
Angular implementace
Doporučená implementace používá HTTP interceptor.
Interceptor:
- kontroluje expiraci tokenů
- případně provede refresh
- následně odešle request
Proactive refresh
Doporučené zlepšení UX:
Nečekat na úplnou expiraci access tokenu.
Frontend může refresh provést dříve, například pokud:
- access token expiruje za méně než 30 sekund
Tím se omezí:
- race conditions
- paralelní refresh requesty
- selhání requestů během expirace
Odpovědnost backendu
Backend Krameria je plně stateless.
Backend:
- pouze validuje token
- neobnovuje tokeny
- neřídí session
- neprovádí redirect na login
Veškerá správa token lifecycle je odpovědností frontend aplikace.
Oddělení odpovědností
| Vrstva | Odpovědnost |
|---|---|
| Keycloak | vydání tokenů |
| Angular frontend | správa token lifecycle |
| Backend | validace JWT tokenu |
| JwtAuthenticationFilter | autentizace requestu |
Shrnutí
Kramerius používá stateless autentizační model založený na:
- krátkodobém access tokenu
- refresh tokenu
- frontend řízeném refresh flow
Backend nikdy nespravuje session ani token refresh.