Odhláste sa v zabezpečenej aplikácii OAuth

1. Prehľad

V tomto rýchlom výučbe ukážeme, ako môžeme pridať do aplikácie OAuth Spring Security funkciu odhlásenia.

Uvidíme niekoľko spôsobov, ako to urobiť. Najskôr uvidíme, ako sa odhlásiť nášho používateľa Keycloak z aplikácie OAuth, ako je popísané v časti Vytvorenie rozhrania REST API s protokolom OAuth2, a potom pomocou proxy servera Zuul, ktorý sme videli už skôr.

Zásobník OAuth použijeme v Spring Security 5. Ak chcete použiť starší zásobník Spring OAuth, pozrite si tento predchádzajúci článok: Odhláste sa v zabezpečenej aplikácii OAuth (pomocou starého balíka).

2. Odhlásenie pomocou aplikácie front-end

Pretože prístupové tokeny sú spravované autorizačným serverom, bude potrebné ich na tejto úrovni zneplatniť. Presný postup sa bude mierne líšiť v závislosti od autorizačného servera, ktorý používate.

V našom príklade, podľa dokumentácie Keycloak, môžeme pre odhlásenie priamo z aplikácie prehliadača presmerovať prehliadač na // auth-server / auth / realms / {realm-name} / protocol / openid-connect / logout? redirect_uri = encodedRedirectUri.

Spolu s odoslaním URI presmerovania musíme tiež odovzdať znak id_token_hint do koncového bodu Logout od spoločnosti Keycloak. Toto by malo niesť zakódované id_token hodnotu.

Pripomeňme si, ako sme zachránili prístupový token, podobne uložíme id_token tiež:

saveToken (token) {var expireDate = new Date (). getTime () + (1000 * token.expires_in); Cookie.set ("access_token", token.access_token, expireDate); Cookie.set ("id_token", token.id_token, expireDate); this._router.navigate (['/']); } 

Dôležité je, aby sme získali token ID v užitočnom množstve odpovede autorizačného servera, mali by sme zahrnúť otvorený v parametri rozsahu.

Teraz sa pozrime na proces odhlásenia v akcii.

Upravíme našu funkciu odhlásiť sa v App Service:

logout () {let token = Cookie.get ('id_token'); Cookie.delete ('access_token'); Cookie.delete ('id_token'); nech logoutURL = "// localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / logout? id_token_hint =" + token + "& post_logout_redirect_uri =" + this.redirectUri; window.location.href = logoutURL; }

Okrem presmerovania musíme tiež vyhodiť prístupové a identifikačné tokeny ktoré sme získali z autorizačného servera.

Preto sme vo vyššie uvedenom kóde najskôr odstránili tokeny a potom sme prehliadač presmerovali na Keycloak odhlásiť sa API.

Pozoruhodne sme prešli v presmerovaní URI ako // localhost: 8089 / - ten, ktorý používame v celej aplikácii - takže po odhlásení skončíme na vstupnej stránke.

Vymazanie prístupových, identifikačných a obnovovacích tokenov zodpovedajúcich aktuálnej relácii sa vykonáva na konci autorizačného servera. Naša aplikácia prehľadávača v tomto prípade vôbec neuložila obnovovací token.

3. Odhlásenie pomocou servera Zuul Proxy

V predchádzajúcom článku o narábaní s obnovovacím tokenom sme nastavili našu aplikáciu tak, aby bola schopná obnovovať prístupový token pomocou obnovovacieho tokenu. Táto implementácia využíva server Zuul s vlastnými filtrami.

Tu uvidíme, ako pridať vyššie uvedené funkcie odhlásenia.

Tentokrát použijeme na odhlásenie používateľa ďalšie rozhranie API Keycloak. Budeme vyvolávať POST na serveri odhlásiť sa koncový bod na odhlásenie relácie pomocou vyvolania iného ako prehľadávač, namiesto presmerovania adresy URL, ktoré sme použili v predchádzajúcej časti.

3.1. Definujte trasu pre odhlásenie

Na začiatok pridáme ďalšiu cestu k proxy v našom aplikácia.yml:

zuul: route: // ... auth / refresh / revoke: cesta: / auth / refresh / revoke / ** sensitiveHeaders: url: // localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / logout / / auth / obnovovacia trasa

V skutočnosti sme k už existujúcej doplnili trasu auth / refresh. Je dôležité, aby sme pred hlavnou trasou pridali čiastkovú trasu, inak bude Zuul vždy mapovať adresu URL hlavnej trasy.

Namiesto hlavnej trasy sme pridali vedľajšiu cestu, aby sme mali prístup iba k protokolu HTTP refreshToken cookie, ktorá bola nastavená tak, aby mala veľmi obmedzenú cestu ako / auth / refresh (a jeho podcesty). Uvidíme, prečo potrebujeme cookie v ďalšej časti.

3.2. POST na autorizačný server /odhlásiť sa

Teraz poďme vylepšiť CustomPreZuulFilter implementácia na zachytenie / auth / refresh / revoke URL a pridajte potrebné informácie, ktoré sa majú odovzdať autorizačnému serveru.

Parametre formulára požadované na odhlásenie sú podobné parametrom žiadosti o obnovenie tokenu, ibaže neexistuje grant_type:

@ Verejná trieda komponentu CustomPostZuulFilter rozširuje ZuulFilter {// ... @Override public Object run () {// ... if (requestURI.contains ("auth / refresh / revoke")) {String cookieValue = extractCookie (req, " refreshToken "); String formParams = String.format ("client_id =% s & client_secret =% s & refresh_token =% s", CLIENT_ID, CLIENT_SECRET, cookieValue); bytes = formParams.getBytes ("UTF-8"); } // ...}}

Tu sme jednoducho extrahovali refreshToken cookie a zasiela sa požadované formParams.

3.3. Odstráňte obnovovací token

Pri odvolaní prístupového tokenu pomocou odhlásiť sa presmerovanie, ako sme videli skôr, obnovovací token s ním spojený je tiež zneplatnený autorizačným serverom.

V tomto prípade však httpLen cookie zostane nastavená na Klientovi. Pretože ho nemôžeme odstrániť pomocou JavaScriptu, musíme ho odstrániť na strane servera.

K tomu pridajme CustomPostZuulFilter implementácia, ktorá zachytáva / auth / refresh / revoke URL tak, že bude odstrániť refreshToken cookie pri stretnutí s touto adresou URL:

@ Verejná trieda komponentu CustomPostZuulFilter rozširuje ZuulFilter {// ... @Override public Object run () {// ... String requestMethod = ctx.getRequest (). GetMethod (); if (requestURI.contains ("auth / refresh / revoke")) {Cookie cookie = new Cookie ("refreshToken", ""); cookie.setMaxAge (0); ctx.getResponse (). addCookie (cookie); } // ...}}

3.4. Odstráňte prístupový token z uhlového klienta

Okrem zrušenia obnovovacieho tokenu, prístupový token cookie bude tiež potrebné odstrániť na strane klienta.

Pridajme k nášmu uhlovému ovládaču metódu, ktorá vymaže prístupový token cookie a zavolá na / auth / refresh / revoke Mapovanie POST:

logout () {let headers = new HttpHeaders ({'Content-type': 'application / x-www-form-urlencoded; charset = utf-8'}); this._http.post ('auth / refresh / revoke', {}, {headers: headers}) .subscribe (data => {Cookie.delete ('access_token'); window.location.href = '// localhost: 8089 / ';}, err => upozornenie („Nepodarilo sa odhlásiť“)); }

Táto funkcia sa vyvolá po kliknutí na tlačidlo Odhlásiť sa:

Odhlásiť sa

4. Záver

V tomto rýchlom, ale podrobnom výučbe sme si ukázali, ako sa môžeme odhlásiť z účtu používateľa OAuth zabezpečenú aplikáciu a zneplatniť tokeny daného používateľa.

Celý zdrojový kód príkladov nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found