Přeskočit na hlavní obsah

Refresh Token Flow

Refresh tokeny umožňují získat nové access tokeny bez nutnosti interakce uživatele. To je nezbytné pro udržování dlouhotrvajících relací.

Předpoklady

  • Musíte požádat o scope offline_access během počáteční autorizace
  • Refresh tokeny jsou vydávány pouze s Authorization Code flow (ne Client Credentials)

Požadavek na obnovení tokenu

curl -X POST https://your-sso-domain.com/connect/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "client_id=my-app" \
-d "client_secret=my-secret" \
-d "refresh_token=eyJhbGciOiJSUzI1NiIsInR5cCI6InJ0K2p3dCJ9..."

Parametry:

ParametrPovinnýPopis
grant_typeAnoMusí být refresh_token
client_idAnoClient ID vaší aplikace
client_secretPodmíněněVyžadováno pro confidential klienty
refresh_tokenAnoRefresh token z předchozí token odpovědi

Odpověď:

{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6ImF0K2p3dCJ9...(nový)",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6InJ0K2p3dCJ9...(nový)",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...(nový)",
"scope": "openid profile email offline_access"
}

Rotace tokenů

Klubero SSO implementuje rotaci refresh tokenů pro zvýšení bezpečnosti:

  • Každý refresh požadavek vrací nový refresh token
  • Starý refresh token je zneplatněn
  • Vždy ukládejte a používejte nejnovější refresh token
Důležité

Vždy ukládejte nový refresh token z každé odpovědi. Použití starého refresh tokenu po rotaci selže.

Životnost tokenů

Typ tokenuŽivotnostPoznámky
Access Token30 minutKrátká životnost pro bezpečnost
Refresh Token14 dníUmožňuje získat nové access tokeny
Authorization Code5 minutJednorázové použití

Když obnovení selže

Refresh tokeny se mohou stát neplatnými z důvodu:

  1. Token vypršel (po 14 dnech)
  2. Token byl zrušen (uživatel se odhlásil, změnil heslo nebo akce administrátora)
  3. Relace byla zneplatněna (bezpečnostní událost)
  4. Opětovné použití tokenu (použití starého tokenu po rotaci)

Když obnovení selže, přesměrujte uživatele na autorizační endpoint pro opětovnou autentizaci.

Chybová odpověď:

{
"error": "invalid_grant",
"error_description": "The refresh token is no longer valid."
}

Osvědčené postupy

// Proaktivní obnovení tokenu (před vypršením)
function isTokenExpired(token, bufferSeconds = 300) {
const payload = JSON.parse(atob(token.split('.')[1]));
const expiresAt = payload.exp * 1000;
return Date.now() >= expiresAt - (bufferSeconds * 1000);
}

async function ensureValidToken() {
if (isTokenExpired(accessToken)) {
try {
const newTokens = await refreshAccessToken();
accessToken = newTokens.access_token;
refreshToken = newTokens.refresh_token; // Vždy aktualizujte!
} catch (error) {
// Obnovení selhalo - přesměrovat na přihlášení
redirectToLogin();
}
}
return accessToken;
}