Predstavme si webovú aplikáciu s REST API, ktorá spravuje používateľkine chránené údaje — napríklad databázu domácich kvetín.
Takáto aplikácia:
-
beží napr. na https://domacekvetiny.io/api
-
prístup k údajom vyžaduje autorizáciu, čiže schválený prístup
Takáto aplikácia nazýva Resource Server. Chránené údaje sú zdroje, teda protected resources. |
A predstavme si druhú aplikáciu, ktorá chce automatizovane zalievať domáce kvetiny používateľky.
Na to potrebuje prístup ku používateľkiným chráneným údajom, teda zoznamu jej kvetín.
OAuth je protokol, ktorý umožní používateľke delegovať prístup k svojim chráneným zdrojom na vybranú aplikáciu. Táto aplikácia sa volá klient a pristupuje k chráneným zdrojom v mene používateľky (on behalf of). |
Používateľka tak vie delegovať prístup k svojim domácim kvetinám na automatizovaný zalievač.
Klientom môže byť webová aplikácia, mobilná aplikácia, či napríklad frontendová aplikácia typu SPA. |
Identity Provider (IdP) ako centrálny bod
Keycloak je analógiou recepcie v hoteli. Oficiálne je to autorizačný server (Authorization Server) alebo aj poskytovateľ identít (Identity Provider). |
- Registrovaní klienti
-
Keycloak eviduje klientov.
- Používatelia a ich prihlasovacie údaje
-
Keycloak slúži ako databáza používateľov a hesiel.
- Prístupové tokeny
-
Keycloak vydáva klientom tokeny: preukazy identity a preukazy autorizujúce prístup k chráneným dátam.
Klienti a servery zdrojov
- Mám REST API?
-
Je to resource server.
- Aplikácia produkuje alebo obsahuje dáta, ktoré chcem nazdieľať?
-
Je to resource server.
- Mám mobilnú appku?
-
Je to klient.
- Mám Angular/React v prehliadači?
-
Je to klient.
- Mám Java backend konzumujúci dáta?
-
Je to klient.
Flows: Autorizačné tance
Flow je postupnosť krokov komunikácie medzi:
-
klientom
-
Keycloakom
-
REST API s dátami
-
používateľkou
Aký flow zvoliť?
- Je to React/Angular aplikácia typu SPA v prehliadači?
-
Authorization Code with PKCE, verejný klient
- Je to mobilná appka?
-
Authorization Code with PKCE, verejný klient
- Je to mobilná appka, ktorej naozaj dôverujeme a dokážeme jej zveriť používateľkin login a heslo?
-
Resource Owner Password Credentials, verejný klient
- Je to backendová aplikácia v Jave/PHP/Go?
-
Authorization Code with PKCE, dôverný klient
- Je to servisná aplikácia / démon / monitorovacia aplikácia na serverovom backende, kde nie je potrebné prihlásenie používateľky?
-
Client Credentials, dôverný klient
- Je to serverová backendová aplikácia, ktorej vieme zveriť používateľkin login a heslo?
-
Resource Owner Password Credentials, dôveryhodný klient
- Používame autorizačný server ako databázu používateľov, lebo migrujeme na OAuth?
-
Resource Owner Password Credentials; klient podľa typu aplikácie.
- Beží aplikácia na televízore, hernej konzole, či inom zariadení, kde nevieme rozumne zadávať text?
-
Device Authorization, verejný klient
- Ešte stále som zmätený?
-
Flow Authorization Code with PKCE, verejný klient.
Klient alebo server?
- Produkujem chránené dáta?
-
Resource Server
- Konzumujem chránené dáta?
-
Client
- Chcem „prihlásiť pomocou Google / Facebook / GitHub“?
-
Client
Klienti
Ak potrebujeme aplikáciu, ktorá konzumuje chránené zdroje, musíme:
-
Programovať klienta (client).
-
Zaevidovať ho v autorizačnom serveri.
-
Získať jeho jednoznačný identifikátor: Client ID.
-
Tento identifikátor použiť v konfigurácii klienta.
Typ klienta?
- confidential
-
klienti s uzavretým kódom, ktoré bežia na serveri. Poznajú „klientske heslo“ (client secret), ktoré nikdy nesmie uniknúť.
Klient sa Keycloaku preukáže identifikátorom a klientskym heslom, čo je jeho login a heslo.
- public
-
klienti s otvoreným kódom, ktorí nedokážu bezpečne preukázať svoju identitu, ani spravovať svoje klientske tajomstvo.
Akákoľvek aplikácia sa dokáže prevteliť do akéhokoľvek verejného klienta.
Tri tokeny v OIDC
Súčasťou flowov je REST endpoint Keycloaku — obvykle /token
— ktorý vracia tri tokeny vo formáte JWT.
Všetky tokeny sú súčasťou JSONu v tele odpovede.
- identity token
-
Preukaz autentifikácie — úspešného prihlásenia. Obsahuje údaje o používateľke (login, meno, e-mail)
- access token
-
Preukaz autorizácie k chráneným dátam. Prikladá sa k volaniam REST API do hlavičky
Authorization: Bearer
.Obsahuje roly, oprávnenia, či scopes.
Má obmedzenú platnosť, obvykle pol minúty, minútu, či inú krátku dobu.
Môže obsahovať aj používateľkine údaje.
- refresh token
-
Dlhotrvajúci token umožňujúci predĺžiť vydať nový prístupový token, ak predošlý vyprší.
Klient vie v Keycloaku vymeniť starý prístupový token a obnovovací token za nový prístupový token.
Čo sú scopes
Scopes je ľubovoľná množina reťazcov, obvykle pre roly, či oprávnenia. |
Keycloak dokáže poskytnúť scope pre používateľkin e-mail (email
), používateľkin profil (profile
), či pridelené roly (roles
).
-
Keycloak má pri evidovanom klientovi povedané, aké scopy mu dokáže poskytnúť.
-
Klient dokáže pri autorizácii požiadať o konkrétnu množinu scopov a Keycloak usúdi, ktoré z nich dokáže splniť. Scope
openid
je povinný.
Scopes sa vedia mapovať na GUI, ktoré vyžaduje súhlas používateľky s delegáciou.
Consent — výslovný súhlas s delegovaním
Klient môže vyžadovať explicitný súhlas používateľky so získavaním chránených zdrojov v jej mene.
Pri prvom prístupe si tak Keycloak od používateľky vyžiada explicitný súhlas — consent.
V prípade Keycloaku sa jednotlivé položky zo súhlasu sa priamo mapujú na scopes, ktoré poskytuje autorizačný server:
- User profile
-
mapovaný na scope
profile
. - Email address
-
mapovaný na scope
email
. - User roles
-
mapovaný na scope
roles
obsahujúci používateľské roly konfigurovateľné v Keycloaku.
Metadáta autorizačného servera
Keycloak poskytuje JSON s metadátami OIDC:
-
autorizačný endpoint pre získanie autorizačného kódu
-
endpoint, ktorým získame tokeny
-
endpoint pre získanie informácií o používateľke (userinfo)
-
endpoint pre získanie verejných kľúčov pre overenie digitálnych podpisov tokenov JWT
Dostupná je na adrese http://localhost:8080/realms/master/.well-known/openid-configuration
JWT
JWT pozostáva z 3 častí. Prvé dve časti sú vo formáte JSON, všetky časti sú kódované cez Base64.
JSON obsahuje claims, teda tvrdenia.
-
hlavička: JOSE Header.
Hlavička JOSE s dvoma tvrdeniami{ "alg": "HS256", "typ": "JWT" }
Hlavička indikuje algoritmus pre elektronický podpis.
-
telo tokenu: payload
Hlavička JOSE so 4 tvrdeniami{ "exp" : 1681045903, "iat" : 1681044103, "sub" : "212aa1c7-667e-4c2b-a99b-4c050ea94644", "scope" : "openid profile email", }
-
exp
: tvrdenie s dátumom expirácie tokenu -
iat
: Issued At — tvrdenie s dátumom vydania -
sub
: identifikátor používateľky z Keycloaku -
scope
: zoznam scopovv
-
-
digitálny podpis: signature Hlavička a telo sú podpísané algoritmom a symetrickou/asymetrickou šifrou. Podpis je kódovaný Base64.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODEwNTQxNzd9.SURFKdNgESGuubuvN9FgzBT929SjFmqXKJ29SSGM0vM
Vidíme 3 zložky oddelené bodkami.