Log ud i et OAuth-sikret program

1. Oversigt

I denne hurtige vejledning skal vi vise, hvordan vi kan tilføj logout-funktionalitet til en OAuth Spring Security-applikation.

Vi ser et par måder at gøre dette på. Først ser vi, hvordan vi logger ud af vores Keycloak-bruger fra OAuth-applikationen som beskrevet i Oprettelse af en REST API med OAuth2 og derefter ved hjælp af Zuul-proxyen, som vi så tidligere.

Vi bruger OAuth-stakken i Spring Security 5. Hvis du vil bruge Spring Security OAuth legacy stack, skal du kigge på denne tidligere artikel: Log af i et OAuth Secured Application (ved hjælp af den legacy stack).

2. Log af med Front-End-applikation

Da adgangstokens administreres af autorisationsserveren, skal de ugyldiggøres på dette niveau. De nøjagtige trin til at gøre dette vil være lidt forskellige afhængigt af autorisationsserveren, du bruger.

I vores eksempel kan vi i henhold til Keycloak-dokumentationen omdirigere browseren til at logge ud direkte fra en browserapplikation // auth-server / auth / realms / {realm-name} / protocol / openid-connect / logout? redirect_uri = encodedRedirectUri.

Sammen med afsendelse af URI til omdirigering er vi også nødt til at sende en id_token_hint til Keycloaks Logout-slutpunkt. Dette skal bære det kodede id_token værdi.

Lad os huske, hvordan vi havde reddet adgangstoken, gemmer vi på samme måde id_token såvel:

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

Vigtigere er det, at vi skal medtage for at få ID-token i autorisationsservers svarbelastning åben i omfangsparameteren.

Lad os nu se udlogningsprocessen i aktion.

Vi ændrer vores funktion Log ud i App-service:

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

Bortset fra omdirigering, vi har også brug for at kassere adgangs- og ID-tokens som vi havde fået fra autorisationsserveren.

Derfor slettede vi først i ovenstående kode tokens og omdirigerede derefter browseren til Keycloak's Log ud API.

Især passerede vi i omdirigerings-URI som // localhost: 8089 / - den, vi bruger i hele applikationen - så vi ender på landingssiden efter aflogning.

Sletningen af ​​Access, ID og Refresh Tokens svarende til den aktuelle session udføres i slutningen af ​​autorisationsserveren. Vores browserapplikation havde slet ikke gemt opdateringstokenet i dette tilfælde.

3. Log ud ved hjælp af Zuul Proxy

I en tidligere artikel om Håndtering af Opdater Token har vi oprettet vores applikation til at kunne opdatere Access Token ved hjælp af et Opdater Token. Denne implementering gør brug af en Zuul-proxy med tilpassede filtre.

Her ser vi, hvordan du tilføjer logout-funktionaliteten til ovenstående.

Denne gang bruger vi en anden Keycloak API til at logge ud af en bruger. Vi påkalder POST på Log ud slutpunkt for at logge ud af en session via en ikke-browseropkaldi stedet for URL-omdirigering, vi brugte i det foregående afsnit.

3.1. Definer rute til aflogning

Til at begynde med, lad os tilføje en anden rute til proxyen i vores ansøgning.yml:

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

Faktisk tilføjede vi en underrute til den allerede eksisterende godkend / opdater. Det er vigtigt, at vi tilføjer underruten før hovedruten, ellers kortlægger Zuul altid URL'en til hovedruten.

Vi tilføjede en underrute i stedet for en hovedrute for at få adgang til kun HTTP refreshToken cookie, som blev indstillet til at have en meget begrænset sti som / autent / opdater (og dets understier). Vi ser, hvorfor vi har brug for cookien i det næste afsnit.

3.2. POST til autorisationsservers /Log ud

Lad os nu forbedre CustomPreZuulFilter implementering for at opfange / godkende / opdatere / tilbagekalde URL og tilføj de nødvendige oplysninger, der skal videregives til autorisationsserveren.

De formularparametre, der kræves til logout, svarer til dem i anmodningen Opdater token, medmindre der ikke er nogen tilskudstype:

@Komponent offentlig klasse CustomPostZuulFilter udvider 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"); } // ...}}

Her ekstraherede vi simpelthen refreshToken cookie og sendt det krævede formParams.

3.3. Fjern opdateringstokenet

Når du tilbagekalder adgangstoken ved hjælp af Log ud omdirigering som vi så tidligere, er opdateringstokenet, der er knyttet til det, også ugyldiggjort af autorisationsserveren.

I dette tilfælde er httpKun cookie forbliver indstillet på klienten. Da vi ikke kan fjerne det via JavaScript, er vi nødt til at fjerne det fra serversiden.

Lad os tilføje til det CustomPostZuulFilter implementering, der opfanger / godkende / opdatere / tilbagekalde URL, så det bliver Fjern refreshToken cookie når du støder på denne URL:

@Komponent offentlig klasse CustomPostZuulFilter udvider ZuulFilter {// ... @Override public Object run () {// ... String requestMethod = ctx.getRequest (). GetMethod (); if (requestURI.contains ("auth / refresh / revoke")) {Cookie cookie = ny cookie ("refreshToken", ""); cookie.setMaxAge (0); ctx.getResponse (). addCookie (cookie); } // ...}}

3.4. Fjern Access Token fra Angular Client

Udover at tilbagekalde Refresh Token, har adgangstoken cookie skal også fjernes fra klientsiden.

Lad os tilføje en metode til vores kantede controller, der rydder adgangstoken cookie og kalder / godkende / opdatere / tilbagekalde POST-kortlægning:

logout () {let headers = new HttpHeaders ({'Content-type': 'application / x-www-form-urlencoded; charset = utf-8'}); this._http.post ('auth / refresh / revoke', {}, {headers: headers}). abonner (data => {Cookie.delete ('access_token'); window.location.href = '// localhost: 8089 / ';}, err => alarm (' Kunne ikke logge ud ')); }

Denne funktion kaldes, når du klikker på Logout-knappen:

Log ud

4. Konklusion

I denne hurtige, men dybtgående vejledning har vi vist, hvordan vi kan logge ud af en bruger fra en OAuth sikret applikation og ugyldiggør brugerens tokens.

Den fulde kildekode for eksemplerne kan findes på GitHub.


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