

OAuth 2.0, OpenID Connect, Keycloak a Spring Boot -- Spring Boot ochránená token...
source link: https://novotnyr.github.io/scrolls/oauth-oidc-keycloak-spring-boot-2/
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 2.0, OpenID Connect, Keycloak a Spring Boot
OAuth 2.0, OpenID Connect, Keycloak a Spring Boot – Spring Boot ochránená tokenmi JWT
2023/03/25
V predošlom dieli sme si ukázali, ako je možné rozbehať Keycloak v jednoduchej podobe „databázy pre používateľov a kontá“.
Teraz si ukážme, ako je možné zobrať backendovú aplikáciu s REST API, a ochrániť ju tak, aby bola dostupné len po prihlásení používateľa cez Keycloak.
Plán práce bude:
-
Pripravíme si REST API cez Spring Boot.
-
Zabezpečíme ho cez knižnicu Spring Security, ktorá sa postará o autorizáciu.
-
Dodáme integráciu s Keycloakom pomocou štandardu OAuth 2.0 / OpenID Connect 1.0.
-
Ukážeme si, ako je možné zobrať token JWT a použiť ho v REST API na informáciu o prihlásení.
REST API a Spring Boot
Pripravme si aplikáciu v Spring Boote. Najlepšie na to použiť Spring Initializr, či už cez portál https://start.spring.io alebo cez IntelliJ IDEA.
Dôležité je naklikať dva komponenty:
pre REST API
OAuth 2 Resource Serverpre integráciu s Keycloakom.

Náš backend v Spring Boote bude figurovať v role Resource Servera, čo je v terminológii OAuth 2.0 súčiastka, ktorá obsahuje používateľské dáta a zverejňuje ich autentifikovaným používateľom |
Kontrolér pre REST API
Pripravme si metódu pre REST API, ktorá zverejní stav účtu:
Dodajme nad triedu BankApplication
anotáciu RestController
:
Zmeňme tiež port pre HTTP na 8888 — nechceme kolidovať s portom 8080 pre Keycloak.
Spusťme teraz celý backend!
HTTP požiadavky na backend
Na požiadavky budeme používať HTTP klienta zabudovaného v IntelliJ IDEA.
Založme súbor src/test/resources/requests.http
s jediným riadkom:
Súbor je ekvivalentom príkazu pre curl -X GET --location "http://localhost:8888/accounts/1" |
Ak tento súbor spustíme, uvidíme odpoveď, ktorá vyžaduje autorizáciu:
1 | Stavový kód 401 znamená, že sa vyžaduje autorizácia. |
2 | Podľa tejto hlavičky zistíme, že sa postupuje podľa filozofie HTTP Basic. |
Toto všetko sa deje vďaka modulu Spring Security, ktorý sa automaticky objavil v projekte ako závislosť na knižnici spring-boot-starter-oauth2-resource-server .
Toto zatiaľ nemá nič spoločné s OAuth 2.0/OIDC — je to štandardné správanie Spring Security v Spring Boot-e.
|
Integrácia s Keycloakom
Metadáta pre OpenID Connect 1.0
Keycloak ako autorizačný server nad protokolom Open ID Connect zverejňuje metadáta o svojej konfigurácii vo formáte JSON. Takto vieme zistiť napríklad:
-
adresy URL pre jednotlivé endpointy podľa príslušného flowu,
-
informácie o šifrovacích metódach pre tokeny JWT,
-
flowy OAuth 2.0, ktoré tento server podporuje,
Formát sa riadi normou OpenID Connect Discovery 1.0.
Keycloak zverejňuje informácie na dohodnutej adrese, ktorá pre realm Pokojne ju navštívme z prehliadača! |
Spring Boot a modul OAuth 2.0 Resource Server dokáže z tejto adresy zistiť všetko podstatné pre integráciu!
Integrácia medzi Spring Boot a Keycloak
Do application.properties
v Spring Boote stačí dodať jedinú vlastnosť: cestu, z ktorej sa dajú odvodiť metadáta pre OIDC 1.0.
Príponu /.well-known/openid-configuration. si Spring Boot domyslí.
|
Po reštarte aplikácie môžeme zopakovať požiadavku HTTP. Uvidíme stavový kód 401, hoci s inou hlavičkou.
1 | Vyžaduje sa hlavička Bearer , teda sa očakáva token JWT. |
ROPC flow a REST API
Na to, aby REST API fungovalo, potrebujeme získať token JWT. Najjednoduchší spôsob je využiť flow ROPC.
-
Z Keycloaku vymeníme login a heslo za JWT token
-
JWT token priložíme ku požiadavke na springové REST API.
Ak používame IntelliJ IDEA, tak dvojicu požiadaviek vieme prepojiť cez premenné a vyhodnocovače odpovedí.
Odpoveďou bude stav na účte.
Ak by sme používali |
Pozor na ROPC flow
ROPC flow je síce extrémne jednoduchý, ale:
-
Každá aplikácia si musí implementovať svoju vlastnú prihlasovaciu stránku. Teraz síce získavame JWT token cez REST API, ale v reálnom nasadení (napr. cez SPA) musíme odniekiaľ zasielať login a heslo.
-
ROPC vyžaduje extrémnu dôveru v klienta: musíme si byť istí, že login a heslo odovzdané do prihlasovacej stránky v prehliadači či mobilnej appke neunikne nikam bokom, alebo sa neodcudzí po ceste.
-
Klient sa musí bezpečne starať o náš login a heslo a musí ho ukladať na citlivé miesto.
ROPC flow sa už neodporúča používať a v OAuth 2.1 zrejme ani nebude použiteľný. Ak je to možné, systém treba migrovať na lepší flow. |
Sprístupnenie prihlasovacích údajov v REST API
Knižnica Spring OAuth 2 Resource Server sa priamo integruje s možnosťami Spring Security.
Ak chceme zistiť, aký používateľ prišiel do REST API, použime anotáciu AuthenticationPrincipal
nad parametrom typu org.springframework.security.oauth2.jwt.Jwt
.
Pozor, v Spring Boote existuje viacero tried Jwt .
Treba vybrať tú správnu!
|
1 | Informácie o prihlásenom používateľovi vo formáte JWT. |
2 | Objekt Jwt obsahuje všetky claims, teda údaje o používateľovi v podobe mapy.
Claim sub obsahuje identifikátor UUID používateľa z Keycloaku. |
Mapovanie mena používateľa
Štandardne sa názov principálu berie z claimu sub
.
To však môžeme prispôsobiť — napríklad na claim preferred_username
.
Bean JwtAuthenticationConverter konvertuje token Jwt na objekt Authentication v Spring Security.
|
1 | Názov sa prevezme z claimu preferred_username .
Ten obsahuje napríklad nášho harald -a. |
1 | Z objektu Security Context v Spring Security vieme pomocou výrazu získať priamo názov principála, teda meno používateľa. |
Repozitár
Zdrojové kódy pre celý repozitár sú na GitHube, v repozitári novotnyr/bank-restapi-oidc .
|
Recommend
-
13
Piotr Tesny August 31, 2021 10 minute read
-
7
OAuth 2.0 and OpenID Connect Overview To decide which authentication flow is best for you based on the type of application that you are building, you first need to understand OAuth 2.0 and OpenID Connect and how you can implement the...
-
11
Step-up authentication with OAuth and OpenID Connect Implementing step-up authentication doesn’t need to involve your applications orchestrating calls to multiple complex APIs. Instead, by leveraging the features already...
-
6
Why Developers Do Care About OAuth and OpenID Connect Recently, Okta released an article titled “Nobody Cares About OAuth or OpenID Connect” that authoritatively stated that “Developers don’t care about OAuth or OpenID Co...
-
5
Securing your SignalR applications with OpenID Connect and OAuth
-
12
OAuth made easier with Feathers v4/v5, OpenID Connect and KeycloakIn this article we detail a running setup to authenticate users in your Feathers app based on either their account from public identity provi...
-
3
OAuth 2.0, OpenID Connect, Keycloak a Spring Boot ~/robonovotny
-
10
OAuth 2.0, OpenID Connect, Keycloak a Spring Boot 3 ~/robonovotny
-
6
Flow pre Authorization Code s PKCE pre verejných klientov ~/robonovotny ...
-
11
OAuth 2.0, OpenID Connect, Keycloak a Spring Boot – Flow pre Client Credentials 2023/04/06 Ukážeme si ako použiť aplikáciu v Spring Boote ako OAuth klientku, ktorá sa a...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK