Bezpečnostní doporučení
1. Vždy používejte HTTPS
Veškerá komunikace s Klubero SSO musí používat HTTPS. HTTP požadavky budou odmítnuty.
✓ https://your-sso-domain.com/connect/authorize
✗ http://your-sso-domain.com/connect/authorize
2. Implementujte PKCE pro public klienty
Single Page Applications a mobilní aplikace musí používat PKCE:
// Vygenerujte code verifier a challenge
const verifier = generateCodeVerifier(); // Náhodný řetězec 43-128 znaků
const challenge = await sha256(verifier); // SHA256 hash
// Zahrňte v autorizačním požadavku
const authUrl = `https://your-sso-domain.com/connect/authorize?
code_challenge=${challenge}&
code_challenge_method=S256`;
// Zahrňte verifier v token požadavku
const tokenResponse = await fetch('/connect/token', {
body: `code_verifier=${verifier}&...`
});
3. Validujte parametr state
Vždy generujte a validujte parametr state pro prevenci CSRF útoků:
// Před přesměrováním
const state = generateRandomString(32);
sessionStorage.setItem('oauth_state', state);
// Po callbacku
const returnedState = new URLSearchParams(location.search).get('state');
const savedState = sessionStorage.getItem('oauth_state');
if (returnedState !== savedState) {
throw new Error('State mismatch - možný CSRF útok');
}
4. Bezpečné ukládání tokenů
| Typ klienta | Doporučení pro ukládání |
|---|---|
| Serverová aplikace | Serverová session nebo šifrovaná cookie |
| SPA | Paměť (ne localStorage), nebo httpOnly cookie přes BFF |
| Mobilní aplikace | Secure keychain/keystore |
| Desktopová aplikace | OS credential manager |
Nikdy neukládejte tokeny v
- localStorage (zranitelné XSS)
- Plain cookies (zranitelné CSRF)
- URL parametrech
- Historii prohlížeče
5. Nikdy nevystavujte client secret
Client secret nesmí být nikdy vystaven v:
- Frontend/klientském kódu
- Verzovacím systému (používejte environment proměnné)
- Logech
- Chybových zprávách
- URL
6. Validujte tokeny
Vždy validujte tokeny před tím, než jim budete důvěřovat:
// 1. Ověřte podpis pomocí JWKS
// 2. Zkontrolujte že issuer (iss) odpovídá vašemu SSO serveru
// 3. Zkontrolujte že audience (aud) odpovídá vašemu client_id
// 4. Zkontrolujte že expiration (exp) je v budoucnosti
// 5. Zkontrolujte že nonce odpovídá (pokud používáte)
7. Ošetřete expiraci tokenů
function isTokenExpired(token, bufferSeconds = 60) {
const payload = JSON.parse(atob(token.split('.')[1]));
const expiresAt = payload.exp * 1000;
return Date.now() >= expiresAt - (bufferSeconds * 1000);
}
// Obnovte proaktivně před expirací
if (isTokenExpired(accessToken, 300)) { // 5 min rezerva
accessToken = await refreshToken();
}
8. Používejte minimální scopes
Požadujte pouze scopes, které vaše aplikace skutečně potřebuje:
# Dobře - minimální scopes
scope=openid profile email
# Vyhněte se - požadování všeho
scope=openid profile email phone address offline_access users:read users:write
9. Implementujte správné odhlášení
Při odhlašování:
- Zneplatněte refresh token (na serveru)
- Vymažte všechny uložené tokeny
- Přesměrujte na SSO logout endpoint
- Vymažte session aplikace
10. Monitorujte bezpečnostní události
Sledujte tyto události, které mohou indikovat bezpečnostní problémy:
- Více neúspěšných pokusů o přihlášení
- Obnovení tokenu z nové IP/zařízení
- Neobvyklé požadavky na scopes
- Relace z neočekávané lokace