11

OAuth 2.0, OpenID Connect, Keycloak a Spring Boot -- Flow pre Client Credentials...

 1 year ago
source link: https://novotnyr.github.io/scrolls/oauth-oidc-keycloak-spring-boot-6-client-credentials/
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.
neoserver,ios ssh client

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 autorizuje ako servisná aplikácia.

OAuth podporuje aj situácie, kde sa prístup k údajom udeľuje aplikáciám, ktoré nemajú používateľa. Obvykle ide o servisné aplikácie, démonov, monitoringy a podobne. V týchto aplikáciách neexistuje používateľ, ktorý by schvaľoval prístup k zdrojom — sama aplikácia sa považuje za vlastníka zdrojov.

Grant (flow) typu client_credentials slúži pre aplikácie, ktoré figurujú v dvojrole klienta (OAuth Client) i vlastníka zdrojov (OAuth Resource Owner).

Flow Client Credentials

Vo flowe figurujú len tri súčiastky:

  • Authorization Server: napríklad Keycloak

  • Client: je ním „servisná“ aplikácia.

  • Resource Server: napríklad REST API

Klient je vždy dôverný (confidential), čiže má obvykle uzavretý kód, a dokáže starostlivo ochrániť tajomstvo Client Secret, ktoré sa považuje za citlivý údaj medzi ním a autorizačným serverom.
  1. Klient sa prezentuje svojim identifikátorom (Client ID) a klientskym tajomstvom (Client Secret).

  2. Autorizačný server vráti token.

  3. Klient sa pomocou tokenu autorizuje voči Resource Serveru.

Klient kontaktuje priamo endpoint pre token. Kroky s endpointom pre autorizáciu sa v tomto flowe ignorujú.
flow

Registrácia klienta

Klienta zaregistrujeme v Keycloaku (autorizačnom serveri).

  1. Vytvoríme nového klienta s identifikátorom techbank.

  2. Zapneme autentifikáciu klienta (Client Authentication), pretože ide o dôverného klienta (confidential client).

  3. Vypneme všetky flowy a ponecháme len Service accounts roles, čo zodpovedá grantu Client Credentials z OAuth 2.0.

keycloak registration

Skúška správnosti

Ak je klient registrovanný, môžeme overiť flow.

Ukážka dopytu:

1 Požiadavku typu POST posielame na endpoint Keycloaku, ktorý vydá token.
2 Telo požiadavky sú formulárové údaje.
3 Používame flow typu Client Credentials.
4 Klient sa autentifikuje dvojicou Client ID a Client Secret, ktorá zodpovedá zaregistrovaným údajom v autorizačnom serveri Keycloak

Odpoveďou bude prístupový token (access token). Ak používame OpenID Connect, token bude vo formáte JWT.

Token následne vieme priložiť ku volaniu resource servera, teda nejakého REST API.

Pre Keycloak bude vyzerať JWT token nasledovne:

1 Reprezentuje identifikátor technického používateľa. V Keycloaku vznikne používateľ service-account-techbank, ktorému je možné nastaviť roly a ďalšie oprávnenia.

Klient v Spring Boote

Klienta, ktorý sa bude pripájať k resource serveru postavíme na základe triedy WebClient, teda reaktívnom HTTP klientovi.

Použijeme závislosti:

  • Spring OAuth 2 Client: spring-boot-starter-oauth2-client

  • Spring WebFlux: spring-boot-starter-webflux s podporou pre reaktívne aplikácie

Konfigurácia aplikácie

Klient pre OAuth potrebuje konfiguráciu — identifikátor klienta, jeho tajomstvo, explicitne uvedený flow a adresu, kde je k dispozícii Keycloak.

Konfigurácia klienta pre HTTP

Naša servisná aplikácia bude každých pár sekúnd pingať REST API na vzdialenom serveri — teda bude posielať jednoduchú požiadavku v HTTP.

Aby dokázala bežať dlho, priamo ju spustíme ako službu bežiacu nad reaktívnym serverom Netty, o čo sa postará Spring WebFlux.

Budeme potrebovať:

  1. bean, ktorý bude udržiavať autorizovaný stav

  2. HTTP klienta WebClient

  3. funkciu, ktorá prepojí klienta s autorizačnými mechanizmami OAuth a bude automaticky posielať prihlasovacie požiadavky na Keycloak.

beans

Bean pre autorizovaný stav

Trieda ReactiveOAuth2AuthorizedClientManager berie klientov, ktorí sú nakonfigurovaní v application.properties, dokáže ich autorizovať voči autorizačnému serveru, po úspešnej autentifikácii ich vyhlásiť za autorizovaných klientov a tento zoznam ukladať (perzistovať) do vhodného úložiska.

Keďže náš klient nepobeží v rámci webovej aplikácie — požiadavky cez HTTP budú vyvolávané autonómne, použijeme implementáciu AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager.

Trieda má dve závislosti, ktoré nám Spring Boot WebFlux dodá automaticky:

  • zoznam klientov spravovaný ReactiveClientRegistrationRepository.

  • manažment autorizovaných klientov ReactiveOAuth2AuthorizedClientService, ktorý dokáže na základe identifikátora klienta a autentifikácie Authentication poskytnúť autorizovaného klienta, a zároveň ich udržiavať v príslušnom úložisku.

WebClient

Klienta pre HTTP prepojíme s autorizáciou.

Trieda ServerOAuth2AuthorizedClientExchangeFilterFunction integruje klienta pre HTTP (WebClient) s mechanizmami OAuth.

Spolupracuje s ReactiveOAuth2AuthorizedClientManager, ktorý rieši nízkoúrovňové technikálie.

Ak tieto tri triedy prepojíme, získame klienta WebClient, ktorý vie automaticky kontaktovať Keycloak, získať token, a priložiť ho k požiadavkam smerovaným na REST API.

OAuthConfiguration.java
1 Ako závislosť si vyžiadame správcu autorizovaných klientov pre OAuth. Tú dostaneme v podobe beanu nakonfigurovaného v predošlom kroku.
2 Vytvoríme filter, ktorý sa postará o integráciu s OAuth.
3 Keďže filter beží autonómne, mimo požiadavky HTTP, musíme explicitne povedať, na ktorého klienta z application.properties sa táto konfigurácia vzťahuje.
4 Filter zapojíme do klienta WebClient.

Integrácie

Od tejto chvíle môžeme automaticky používať klienta WebClient.

Ak chceme napríklad periodicky posielať dopyty na server:

  1. zapneme anotáciu @EnableScheduling,

  2. vyrobíme metódu s anotáciou @Scheduled,

  3. automaticky nadrôtujeme klienta WebClient,

  4. voláme požiadavky na resource server.

1 Necháme si automaticky nadrôtovať klienta pre HTTP požiadavky vrátane integrácie s OAuth.
2 Voláme klienta.
3 Periodicky zapneme volanie metódy.
V tomto prípade sa s každým volaním klienta získa nový token z autorizačného servera. V každej iterácii sa tak v skutočnosti vykonajú dva dopyty: jeden na autorizačný server a druhý na príslušné REST API v resource serveri.

Záver

Repozitár s kódom pre Spring Boot je k dispozícii na GitHube, v repozitáru novotnyr/bank-oidc-client-credentials.

>> Home


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK