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:

Takáto aplikácia nazýva Resource Server. Chránené údaje sú zdroje, teda protected resources.
resource server

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č.

access on behalf of
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:

  1. Programovať klienta (client).

  2. Zaevidovať ho v autorizačnom serveri.

  3. Získať jeho jednoznačný identifikátor: Client ID.

  4. 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.

keycloak 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

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.

  1. hlavička: JOSE Header.

    Hlavička JOSE s dvoma tvrdeniami
    {
      "alg": "HS256",
      "typ": "JWT"
    }

    Hlavička indikuje algoritmus pre elektronický podpis.

  2. 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

  3. digitálny podpis: signature Hlavička a telo sú podpísané algoritmom a symetrickou/asymetrickou šifrou. Podpis je kódovaný Base64.

Minimalistický JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODEwNTQxNzd9.SURFKdNgESGuubuvN9FgzBT929SjFmqXKJ29SSGM0vM

Vidíme 3 zložky oddelené bodkami.

>> Home