OAuth, OpenID Connect -- Ťahák | robonovotny
source link: https://novotnyr.github.io/scrolls/oauth-oidc-tahak/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
OAuth, OpenID Connect – Ťahák
2023/04/09
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). |
Keycloak eviduje klientov.
Používatelia a ich prihlasovacie údajeKeycloak slúži ako databáza používateľov a hesiel.
Prístupové tokenyKeycloak vydáva klientom tokeny: preukazy identity a preukazy autorizujúce prístup k chráneným dátam.
Klienti a servery zdrojov
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ť?
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?
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?
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.
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.
Preukaz autentifikácie — úspešného prihlásenia. Obsahuje údaje o používateľke (login, meno, e-mail)
access tokenPreukaz 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.
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:
mapovaný na scope profile
.
mapovaný na scope email
.
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 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 tvrdeniamiHlavička indikuje algoritmus pre elektronický podpis.
-
telo tokenu: payload
Hlavička JOSE so 4 tvrdeniami-
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.
Vidíme 3 zložky oddelené bodkami.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK