Kijelentkezés egy OAuth biztonságos alkalmazásban

1. Áttekintés

Ebben a gyors bemutatóban megmutatjuk, hogyan tudunk adjon hozzá kijelentkezési funkciót egy OAuth Spring Security alkalmazáshoz.

Látni fogunk erre pár módot. Először meglátjuk, hogyan lehet kijelentkeztetni Keycloak felhasználóinkat az OAuth alkalmazásból, a REST API létrehozása az OAuth2 segítségével című részben leírtak szerint, majd a korábban látott Zuul proxy használatával.

Az OAuth-csomagot a Spring Security 5-ben fogjuk használni. Ha használni szeretné a Spring Security OAuth örökölt veremét, olvassa el ezt a korábbi cikket: Kijelentkezés egy OAuth biztonságos alkalmazásból (a régi verem használatával).

2. Kijelentkezés a kezelőfelület alkalmazásával

Mivel az Access Tokeneket az Authorization Server kezeli, ezen a szinten érvényteleníteni kell őket. Ennek pontos lépései kissé eltérnek a használt Authorization Server-től függően.

Példánkban, a Keycloak dokumentációjának megfelelően, közvetlenül a böngészőalkalmazásból való kijelentkezéshez átirányíthatjuk a böngészőt a // auth-server / auth / realms / {realm-name} / protokoll / openid-connect / logout? redirect_uri = encodedRedirectUri.

Az átirányítás URI küldésével együtt át kell adnunk egy id_token_hint a Keycloak Logout végpontjához. Ennek a kódoltat kell hordoznia id_token érték.

Emlékezzünk vissza arra, hogyan mentettük el access_token, hasonló módon mentjük a id_token is:

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 (['/']); } 

Fontos, hogy az azonosító token megszerzéséhez az engedélyezési kiszolgáló választerhelésében meg kell adnunk nyitott a hatókör paraméterben.

Most nézzük meg a kijelentkezés folyamatát.

Módosítjuk a funkciónkat Kijelentkezés ban ben App Service:

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

Az átirányításon kívül el kell dobnunk az Access és az ID tokenteket is amelyet a Authorization Server-től szereztünk be.

Ezért a fenti kódban először töröltük a tokeneket, majd átirányítottuk a böngészőt a Keycloak's-ba Kijelentkezés API.

Nevezetesen, átadtuk az átirányítási URI-t as // localhost: 8089 / - az egyik, amelyet az alkalmazás során használunk - tehát kijelentkezés után a céloldalra kerülünk.

Az aktuális munkamenetnek megfelelő Hozzáférési, azonosító és Frissítési tokenek törlését az Engedélyező kiszolgáló végén hajtjuk végre. Böngésző alkalmazásunk ebben az esetben egyáltalán nem mentette a Frissítési tokent.

3. Kijelentkezés a Zuul Proxy használatával

A Frissítési token kezeléséről szóló korábbi cikkünkben úgy állítottuk be alkalmazásunkat, hogy az Frissítési token használatával képes legyen frissíteni az Access Tokent. Ez a megvalósítás Zuul proxyt használ egyedi szűrőkkel.

Itt megtudhatjuk, hogyan adhatjuk hozzá a kijelentkezési funkciót a fentiekhez.

Ezúttal egy másik Keycloak API-t fogunk használni a felhasználó kijelentkezéséhez. Meghívjuk a POST-ot a Kijelentkezés végpont a munkamenet kijelentkezéséhez nem böngésző meghívással, az előző szakaszban használt URL-átirányítás helyett.

3.1. Definiálja a kijelentkezés útvonalát

Először adjunk hozzá egy másik útvonalat a proxybe a alkalmazás.yml:

zuul: útvonalak: // ... auth / frissítés / visszavonás: elérési út: / auth / frissítés / visszavonás / ** sensitiveHeaders: url: // localhost: 8083 / auth / realms / baeldung / protocol / openid-connect / logout / / auth / refresh route

Valójában egy alvonalat adtunk a már meglévőhöz hitelesítés / frissítés. Fontos, hogy az alvonalat hozzáadjuk a fő útvonal elé, különben Zuul mindig feltérképezi a fő útvonal URL-jét.

A fő HTTP helyett egy alútvonalat adtunk hozzá, hogy hozzáférhessünk a csak HTTP-hez refreshToken cookie, amelynek beállítása nagyon korlátozott volt / auth / refresh (és részútvonalai). A következő részben megtudjuk, miért van szükségünk a sütire.

3.2. POST az engedélyezési kiszolgálóhoz /Kijelentkezés

Most fokozzuk a CustomPreZuulFilter végrehajtása a / auth / refresh / visszavonás URL-t, és adja hozzá a szükséges információkat, amelyeket továbbít az Authorization Server-hez.

A kijelentkezéshez szükséges űrlapparaméterek hasonlóak a Token frissítése kéréshez, csak nincs grant_type:

@Component public class CustomPostZuulFilter kiterjeszti a ZuulFilter {// ... @Orride public Object run () {// ... if (requestURI.contains ("auth / refresh / revoke")) {String cookieValue = extractCookie (req, " refreshToken "); Karakterlánc formParams = Karakterlánc.formátum ("kliens_id =% s & kliens_ titka =% s & frissítő_token =% s", CLIENT_ID, CLIENT_SECRET, cookieValue); bájtok = formParams.getBytes ("UTF-8"); } // ...}}

Itt egyszerűen kivontuk a refreshToken cookie-t és elküldte a szükséges formParams.

3.3. Távolítsa el a Token frissítését

Az Access Token visszavonásakor a Kijelentkezés átirányítás, amint azt korábban láthattuk, a hozzá tartozó Refresh Token-t a Authorization Server is érvényteleníti.

Ebben az esetben azonban a Csak http a cookie az Ügyfélnél marad. Tekintettel arra, hogy nem tudjuk eltávolítani JavaScript-en keresztül, el kell távolítanunk a szerver felől.

Ehhez tegyük hozzá a CustomPostZuulFilter végrehajtása, amely elfogja a / auth / refresh / visszavonás URL úgy, hogy megtörténjen távolítsa el a refreshToken aprósütemény amikor találkozik ezzel az URL-lel:

@Component public class A CustomPostZuulFilter kiterjeszti a ZuulFilter {// ... @Orride public Object run () {// ... String requestMethod = ctx.getRequest (). GetMethod (); if (requestURI.contains ("auth / frissítés / visszavonás")) {Cookie cookie = new Cookie ("refreshToken", ""); cookie.setMaxAge (0); ctx.getResponse (). addCookie (süti); } // ...}}

3.4. Távolítsa el az Access Tokent az Angular Client programból

A Refresh Token visszavonása mellett a access_token a cookie-kat is el kell távolítani az ügyfél oldalról.

Adjunk hozzá egy szöget vezérlő metódust, amely törli a access_token sütit és felhívja a / auth / refresh / visszavonás POST leképezés:

kijelentkezés () {let headers = new HttpHeaders ({'Content-type': 'application / x-www-form-urlencoded; charset = utf-8'}); this._http.post ('hitelesítés / frissítés / visszavonás', {}, {fejlécek: fejlécek}) .subscribe (adatok => {Cookie.delete ('access_token'); window.location.href = '// localhost: 8089 / ';}, err => alert (' Nem sikerült kijelentkezni ')); }

Ezt a funkciót akkor hívjuk meg, amikor a Kijelentkezés gombra kattintunk:

Kijelentkezés

4. Következtetés

Ebben a gyors, de részletes bemutatóban bemutattuk, hogyan lehet kijelentkeztetni a felhasználót egy OAuth biztonságos alkalmazást, és érvényteleníti az adott felhasználó tokenjeit.

A példák teljes forráskódja megtalálható a GitHub oldalon.