日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

具有Stormpath和Spring Boot的OAuth 2.0令牌管理

發布時間:2023/12/3 javascript 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 具有Stormpath和Spring Boot的OAuth 2.0令牌管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

建筑物身份管理,包括身份驗證和授權? 嘗試Stormpath! 我們的REST API和強大的Java SDK支持可以消除您的安全風險,并且可以在幾分鐘內實現。 注冊 ,再也不會建立auth了!

OAuth 2.0令牌管理經常被誤解并且難以正確實施。 幸運的是,借助Stormpath的SDK和集成,我們使令牌管理變得輕松,有趣。 這個20分鐘的教程將向您展示如何使用Stormpath的Spring Boot和Spring Security集成來實現令牌管理。

雖然Spring Security 確實內置了OAuth 2.0支持,但是Spring Boot中沒有本機令牌管理支持,并且使用OAuth協議已知會導致蕁麻疹,冷汗和長時間的“面部辦公桌”自發爆發。

Stormpath的Spring Boot集成支持兩個OAuth流: grant_type=password和grant_type=refresh_token 。 密碼授予類型允許您傳遞用戶名和密碼,并獲取訪問令牌和刷新令牌。 刷新令牌授予類型允許您傳遞刷新令牌并獲取新的訪問令牌。

它們都可以通過單個端點/oauth/token訪問,該端點可通過Stormpath集成直接使用。 所以,不要害怕! Stormpath的令牌管理負責所有繁重的工作。 您只需要使用下面討論的一些基本規則來創建HTTP請求。

本教程的資源

到本文結束時,您將擁有將用戶名和密碼交換為一組令牌所需要的一切,這些令牌使用戶可以訪問應用程序中的受限資源。 您還可以刷新和撤消令牌,以更好地控制用戶訪問您的應用程序的方式以及他們保持登錄狀態的時間。

支持這篇文章的代碼在這里 。

您可以在以下位置查看運行中的示例: https : //jquery-spa.herokuapp.com (由于Heroku 睡眠策略,您可能需要等待幾秒鐘才能使應用程序最初響應),然后可以將其部署到您的現在使用下面的按鈕使用Heroku帳戶。

雖然令牌管理通常是幕后事務,但此示例使用SPA或單頁應用程序。 為了使示例簡單(并且與Javascript框架無關),所有調用均使用jQuery的ajax功能進行。

現代令牌管理–訪問和刷新令牌

在支持OAuth 2.0令牌管理的現代應用程序中,用戶會話通常具有一個具有較短到期時間的訪問令牌和一個具有較長到期時間的刷新令牌。 當訪問令牌過期時,應用程序將使用刷新令牌來獲取新的訪問令牌。 重復此過程,直到刷新令牌過期。 此時,用戶將需要再次登錄該應用程序。

要深入了解OAuth令牌及其工作原理,請查看我的同事Randall的帖子,其中詳細探討了OAuth 。

JSON Web令牌(JWT)安全PSA

OAuth 2.0規范未指定特定的令牌格式,因此Stormpath使用JWT來表示訪問令牌和刷新令牌。 JWT已將其他信息編碼到其中,更重要的是,它們已被加密簽名以提供確鑿的證據證明令牌未被篡改。

Stormpath訪問令牌還提供了重要的附加安全層–它們始終包含對關聯的刷新令牌的引用。 該參考文獻是由代碼rti標識的權利要求。 這是Stormpath確保它是用于訪問受保護資源的訪問令牌而不是刷新令牌的一種方式。 OAuth 2.0的其他實現(無意間)允許刷新令牌充當訪問令牌,從而為用戶提供了應有的更長訪問時間。 我們對此保持警惕。

如果您想了解有關JWT以及如何安全使用JWT的更多信息,請查看我們的帖子,了解如何正確使用JWT , 使用JWT 構建安全的用戶界面以及將JWT 存儲在何處 。

好的,所有這些都讓我們開始吧!

Spring安全配置

在以下各節中,我們將通過對Spring Boot應用程序中的后端/oauth/token端點進行的jQuery調用來探討示例應用程序。

在開始之前,讓我們看一下該示例應用程序的Spring Security配置:

@Configuration public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.apply(stormpath()).and().authorizeRequests().antMatchers("/").permitAll().antMatchers("/decode").permitAll().antMatchers("/static/**").permitAll();} }

Stormpath的Spring Security集成遵循Spring Security的默認訪問配置,即所有路徑均被鎖定。

在以上配置中,我們允許未經授權的訪問/和/decode以及/static任何路徑。 通過下面的示例,我們將看到這一點。

讓我們獲取一些代幣

在我們的SPA示例中,有兩個主要的靜態文件: home.html和static/js/token-management-guided-tour.js 。

home.html是Thymeleaf模板,其中加載了static/js/token-management-guided-tour.js Javascript文件。

這是home.html不同部分的視圖:

它分為7個步驟,應用程序將引導您完成示例“導游”樣式。

第一步是傳遞電子郵件和密碼,然后取回訪問和刷新令牌。 讓我們看看實際情況。

用電子郵件和密碼登錄

這是jQuery代碼,用于處理對/oauth/token端點的初始請求(為簡便起見,省略了error和complete功能):

$('#login-form').submit(function (e) {var theForm = $('#login-form');$.ajax({type: 'post',url: '/oauth/token',data: theForm.serialize(),success: function (data) {accessToken = data.access_token;refreshToken = data.refresh_token;var accessTokenParts = accessToken.split('.');$.each(['header', 'payload', 'signature'], function (index, value) {$('#access-token-' + value).html(accessTokenParts[index]);});$('#login-error').hide();showOnlyDiv('access-token-div');}});e.preventDefault(); });

第3行為我們提供了該表格的句柄。

根據OAuth規范,該方法將為POST , Content-Type為application/x-www-form-urlencoded (這是jQuery的$.ajax調用的默認設置)。 傳遞給/oauth/token的數據將如下所示:

grant_type=password&username=<username>&password=<password>

這是第8行調用theForm.serialize()的結果。

從第9行開始的成功處理程序將access_token和refresh_token存儲在局部變量中。 它還以JWT的可視表示形式在瀏覽器中顯示access_token的各個部分(標頭,有效負載和簽名):

注意:如屏幕截圖所示,示例應用程序僅用于演示目的。 在“現實生活”中,您不想在瀏覽器中顯示訪問令牌,并且希望使用最佳實踐在客戶端應用程序中存儲令牌。 我們在這里有關于這些最佳實踐的精彩文章。

Stormpath訪問令牌的剖析

在示例應用程序中,如果單擊“ Decode按鈕,您將看到類似以下內容:

這顯示了JWT的標頭和有效負載部分,它們是訪問令牌。 要了解我們如何解碼訪問令牌,我們需要看一下示例應用程序中APIController中的decode方法:

@RequestMapping("/decode") public Jws<Claims> decode(@RequestParam String token) throws UnsupportedEncodingException {Jws<Claims> claims = Jwts.parser().setSigningKey(client.getApiKey().getSecret().getBytes("UTF-8")).parseClaimsJws(token);return claims; }

該方法將JWT(在本例中為我們的訪問令牌)作為參數,并使用JJWT庫解析聲明。 它還將驗證JWT簽名在解析過程中是否有效。 為此,它使用了Stormpath Client的機密,該機密最初是用來創建JWT的。

最后,該方法返回Jws<Claims>對象。 這是Spring Boot的自動Jackson JSON映射器啟動并將該對象轉換為JSON的地方。 這是原始響應的樣子:

{"header": {"kid": "R92SBHJC1U4DAIMGQ3MHOGVMX","alg": "HS256"},"body": {"jti": "6UBPQ975cDDiz8ckHqWIZF","iat": 1456242057,"iss": "https://api.stormpath.com/v1/applications/2nBCvauLgETX8wO0VvS9mQ","sub": "https://api.stormpath.com/v1/accounts/49CK1VvY2jQwUBH7UnP5zC","exp": 1456245657,"rti": "6UBPQ5n0hcukMJWt5af1xB"},"signature": "Pm30FjdXOmx_fMGhfku85Z9xc6qE-EZgKHI4mV46KO8" }

請注意,已解碼JWT的body (有效負載)在sub (主題)聲明中包括對Stormpath帳戶的引用。 訪問受限資源時將使用該帳戶,我們將在后面看到。

使用訪問令牌

解碼訪問令牌后,本示例應用程序的導覽中的下一步是使用該訪問令牌來訪問受限資源。 這是完成此任務的jQuery代碼:

$('#restricted').click(function () {$('#account-info-table tbody').empty();$.ajax({type: 'get',url: '/restricted',success: function (data) {var newRowContent = '<tr><td>' + data.fullName + '</td><td>' + data.email + '</td></tr>';$('#account-info-table tbody').append(newRowContent);showOnlyDiv('account-info-div');}}) });

您可能想知道上述代碼中的身份驗證在哪里。 登錄時,已按照上述步驟在瀏覽器中設置了Cookies。如果您在瀏覽器中查看檢查器,則會看到access_token一直傳遞到請求到/restricted端點。 在單獨的瀏覽器會話中,您可以嘗試點擊: http://localhost:8080/restricted 。 您將被重定向到/login 。 這是我們的Spring Security配置的功能。 /restricted路徑不是我們在Spring Security配置中明確允許的路徑之一,因此,必須對請求進行身份驗證。 為了了解/restricted的響應,讓我們看一下APIController中的restricted方法:

@RequestMapping("/restricted") public AccountInfo restricted(HttpServletRequest req) {Account account = AccountResolver.INSTANCE.getAccount(req);return new AccountInfo(account.getFullName(), account.getEmail()); }

這只是返回一個AccountInfo模型對象,該對象具有經過身份驗證的用戶的全名和電子郵件地址。 在示例應用程序中定義的AccountInfo對象可以通過我們在上面看到的相同的自動Spring Boot映射器過程輕松轉換為JSON。

上面的jQuery success函數顯示從請求返回到/restricted的Account信息。

令牌管理:令人耳目一新!

我們旅程的下一步是使用刷新令牌來獲取新的訪問令牌。 在典型的移動應用程序中,用戶可能不知道以下情況:

  • 當前訪問令牌已過期
  • 用戶嘗試使用(過期的)訪問令牌訪問應用程序的受限部分
  • 該應用程序收到401 (未經授權)的HTTP響應代碼
  • 應用程序使用刷新令牌來獲取新的訪問令牌
  • 應用程序嘗試使用新的訪問令牌訪問應用程序的受限部分
  • 用戶無需再次登錄即可查看該請求的結果
  • 注意:如果刷新令牌已過期,則應用程序的用戶將需要在步驟4再次登錄。

    Stormpath在管理控制臺中提供了OAuth策略,以設置訪問令牌和刷新令牌的到期時間。

    看看OAuth政策

    這是在Stormpath管理控制臺中的OAuth策略:

    訪問令牌的默認生存時間為1小時,而刷新令牌的默認TTL為60天。

    刷新訪問令牌

    當您在示例應用程序中單擊“ Refresh the Access Token按鈕時,您將收到如下響應:

    這將顯示在刷新過程中檢索到的新訪問令牌。 為了了解發生了什么,我們回到jQuery代碼(為簡便起見,省略了成功處理程序):

    $('#refresh').click(function () {$.ajax({type: 'post',url: '/oauth/token',data: 'grant_type=refresh_token&refresh_token=' + refreshToken,success: function (data) {}}) });

    再次,我們對/oauth/token端點進行HTTP POST 。 與grant_type=password流不同,在這種情況下,我們使用的是grant_type=refresh_token ,并且傳入的是之前保存的Refresh Token。

    來自此ajax調用的響應是一個新的訪問令牌,該令牌隨后在瀏覽器中的舊訪問令牌下方顯示。

    將代幣踢到路邊

    我們的令牌管理游戲的最后一部分是撤銷訪問和刷新令牌。 這是通過點擊(內置) /logout端點(將訪問令牌提供為Bearer令牌)來實現的,就像我們之前訪問受限資源時所做的那樣。 讓我們看一下完成此任務的jQuery代碼:

    $('#revoke').click(function () {$.ajax({type: 'post',url: '/logout',success: function () {showOnlyDiv('revoke-div');}}) });

    我們正在向/logout發送HTTP POST請求。 此時,將刪除包含access_token和refresh_token的cookie,并在Stormpath后端撤消令牌。 這是在后臺自動處理的。

    該示例應用程序嘗試再次點擊/restricted路徑。 結果看起來像這樣:

    結果表明,嘗試使用已刪除的訪問令牌將無效。

    綜上所述

    Stormpath的Spring Boot集成中提供了開箱即用的/oauth/token端點,可啟用現代令牌管理系統的所有功能。

    在本文中,我們介紹了什么是訪問令牌和刷新令牌,以及如何獲取,使用,刷新和吊銷它們。

    您可以在以下位置查看本文中使用的示例應用程序: https : //jquery-spa.herokuapp.com,或者您可以使用下面的按鈕將應用程序部署到您自己的Heroku帳戶。

    建筑物身份管理,包括身份驗證和授權? 嘗試Stormpath! 我們的REST API和強大的Java SDK支持可以消除您的安全風險,并且可以在幾分鐘內實現。 注冊 ,再也不會建立auth了!

    翻譯自: https://www.javacodegeeks.com/2016/11/oauth-2-0-token-management-stormpath-spring-boot.html

    總結

    以上是生活随笔為你收集整理的具有Stormpath和Spring Boot的OAuth 2.0令牌管理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。