Odjava iz OAuth zaštićene aplikacije

1. Pregled

U ovom brzom uputstvu pokazat ćemo kako možemo dodajte funkcionalnost odjave u aplikaciju OAuth Spring Security.

Vidjet ćemo nekoliko načina kako to učiniti. Prvo ćemo vidjeti kako odjaviti korisnika Keycloak-a iz aplikacije OAuth kako je opisano u Stvaranju REST API-ja s OAuth2, a zatim, koristeći Zuul proxy koji smo ranije vidjeli.

Koristit ćemo OAuth stog u Spring Security 5. Ako želite koristiti naslijeđeni naslon Spring Security OAuth, pogledajte ovaj prethodni članak: Odjava u OAuth zaštićenom programu (pomoću naslijeđenog snopa).

2. Odjava pomoću Front-End aplikacije

Kako pristupnim tokenima upravlja poslužitelj za autorizaciju, morat će ih onesposobiti na ovoj razini. Točni koraci za to malo će se razlikovati, ovisno o Autorizacijskom poslužitelju koji koristite.

U našem primjeru, prema dokumentaciji Keycloak, za odjavu izravno iz aplikacije preglednika možemo preusmjeriti preglednik na // auth-server / auth / realms / {ime carstva} / protocol / openid-connect / logout? redirect_uri = encodedRedirectUri.

Uz slanje URI-ja za preusmjeravanje, moramo proslijediti i id_token_hint do krajnje točke odjave Keycloak-a. Ovo bi trebalo nositi kodirano id_token vrijednost.

Prisjetimo se kako smo spasili pristupni_token, mi ćemo na sličan način spremiti id_token također:

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

Važno je da bismo trebali uključiti ID žetona u korisničkom odgovoru poslužitelja za autorizaciju openid u parametru opsega.

Pogledajmo sada postupak odjave na djelu.

Izmijenit ćemo našu funkciju Odjavite se u Usluga aplikacija:

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

Osim preusmjeravanja, također moramo odbaciti tokene za pristup i ID koje smo dobili od Autorizacijskog poslužitelja.

Stoga smo u gornjem kodu prvo izbrisali tokene, a zatim preusmjerimo preglednik na Keycloak's Odjavite se API.

Značajno je da smo URI za preusmjeravanje proslijedili kao // localhost: 8089 / - onaj koji koristimo tijekom aplikacije - pa ćemo nakon odjave završiti na odredišnoj stranici.

Brisanje tokena pristupa, ID-a i osvježavanja koji odgovaraju trenutnoj sesiji izvodi se na kraju poslužitelja za autorizaciju. Naša aplikacija preglednika u ovom slučaju uopće nije spremila žeton za osvježavanje.

3. Odjava pomoću Zuul proxyja

U prethodnom članku o rukovanju žetonom za osvježavanje postavili smo našu aplikaciju kako bismo mogli osvježiti pristupni žeton pomoću osvježavajućeg tokena. Ova implementacija koristi Zuul proxy s prilagođenim filtrima.

Ovdje ćemo vidjeti kako dodati funkcionalnost odjave gore navedenom.

Ovaj put ćemo upotrijebiti drugi Keycloak API za odjavu korisnika. Pozvat ćemo POST na Odjavite se krajnja točka za odjavu sesije putem pozivanja koji nije preglednik, umjesto preusmjeravanja URL-a koje smo koristili u prethodnom odjeljku.

3.1. Definirajte rutu za odjavu

Za početak dodamo još jednu rutu proxyju u našem primjena.iml:

zuul: routes: // ... auth / refresh / revoke: path: / auth / refresh / revoke / ** sensitiveHeaders: url: // localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / logout / / auth / refresh ruta

Zapravo smo već postojećem dodali pod-rutu auth / refresh. Važno je da dodamo pod-rutu prije glavne rute, u protivnom će Zuul uvijek mapirati URL glavne rute.

Dodali smo podrumu umjesto glavne kako bismo imali pristup samo HTTP-u refreshToken kolačić, za koji je postavljeno da ima vrlo ograničen put kao / auth / refresh (i njegovi pod-putevi). Zašto će nam trebati kolačić vidjet ćemo u sljedećem odjeljku.

3.2. OBJAVI na poslužitelju autorizacije /Odjavite se

Ajmo sada poboljšati CustomPreZuulFilter provedba za presretanje / auth / refresh / revoke URL i dodajte potrebne podatke za prosljeđivanje na Autorizacijski poslužitelj.

Parametri obrasca potrebni za odjavu slični su onima u zahtjevu za Refresh Token, osim što nema grant_type:

@Component javna klasa CustomPostZuulFilter proširuje ZuulFilter {// ... @Override public Object run () {// ... if (requestURI.contens ("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); bajtova = formParams.getBytes ("UTF-8"); } // ...}}

Ovdje smo jednostavno izdvojili refreshToken kolačić i poslan u potrebnom formParams.

3.3. Uklonite žeton za osvježavanje

Prilikom opoziva pristupnog tokena pomoću Odjavite se preusmjeravanje kao što smo vidjeli ranije, poslužitelj autorizacije također poništava žeton za osvježavanje s njim.

Međutim, u ovom slučaju, httpSamo kolačić će ostati postavljen na Klijentu. S obzirom da ga ne možemo ukloniti putem JavaScript-a, moramo ga ukloniti sa strane poslužitelja.

Za to, dodajmo na CustomPostZuulFilter implementacija koja presreće / auth / refresh / revoke URL tako da hoće uklonite refreshToken kolačić prilikom susreta s ovim URL-om:

@Component javna klasa CustomPostZuulFilter proširuje ZuulFilter {// ... @Override public Object run () {// ... String requestMethod = ctx.getRequest (). GetMethod (); if (requestURI.contens ("auth / refresh / revoke")) {Cookie cookie = novi Cookie ("refreshToken", ""); cookie.setMaxAge (0); ctx.getResponse (). addCookie (kolačić); } // ...}}

3.4. Uklonite token pristupa s kutnog klijenta

Osim opoziva žetona za osvježavanje, pristupni_token kolačić će također trebati ukloniti sa strane klijenta.

Dodajmo metodu našem kutnom kontroleru koja uklanja pristupni_token kolačić i poziva / auth / refresh / revoke POST mapiranje:

odjava () {neka zaglavlja = novi 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 / ';}, pogreška => upozorenje (' Ne mogu se odjaviti ')); }

Ova će se funkcija pozvati klikom na gumb Odjava:

Odjavite se

4. Zaključak

U ovom brzom, ali detaljnom uputstvu, pokazali smo kako možemo odjaviti korisnika s OAuth osigurana aplikacija i onesposobiti tokene tog korisnika.

Potpuni izvorni kod primjera može se naći na GitHubu.


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