簡體   English   中英

Springboot + JWT +OAuth2 + AngularJS 無狀態會話

[英]Springboot + JWT +OAuth2 + AngularJS Stateless session

我正在嘗試各種基於 Java Spring 的安全實現,如下所示

1. JWT 認證

  • 用戶訪問 /
  • Springboot 標識為受保護資源並將用戶重定向到 /login
  • 用戶輸入憑據,瀏覽器對 /authenticate 執行 POST
  • 服務器驗證憑據並生成 JWT 令牌。 設置為響應頭並重定向到 /
  • 瀏覽器加載/。 AngularJS 識別響應頭中的 JWT 令牌並將其存儲在 localStorage 中
  • 所有后續調用都將在標頭中包含 Bearer 令牌(通過 httpInterceptor 注入)

注意:無狀態會話

2.OAuth2認證

  • 用戶訪問 /
  • Springboot 標識為受保護資源並將用戶重定向到 /login
  • /login 被 Spring 安全攔截。 使用生成的狀態重定向到 Oauth2 授權服務器並將 URL 重定向回應用程序
  • 用戶輸入憑據
  • Oauth 服務器重定向回應用程序 URL“/login?code=xxx&state=yyy”
  • /login 被 Spring 安全攔截。 識別代碼和狀態,生成 Cookie 並在響應頭中設置。 重定向到 /
  • 瀏覽器加載/。 瀏覽器識別響應頭中的 cookie 並將其存儲。
  • 如果對 /user 進行調用,則 Principal 對象將填充 JWT,我可以按如下方式提取該 JWT
@RequestMapping(value= {"/user")
public ResponseEntity<Map<String, String>> user(Principal principal) throws Exception {
    OAuth2Authentication obj = (OAuth2Authentication) principal;
    authentication = obj.getUserAuthentication();
    OAuth2AuthenticationDetails oAuth2AuthenticationDetails = (OAuth2AuthenticationDetails) obj.getDetails();
    String jwt = oAuth2AuthenticationDetails.getTokenValue();
  • 所有后續調用都將在請求中包含 Cookie

注意:在服務器端創建有狀態會話來存儲會話詳細信息。 這需要解密 cookie 並識別用戶

現在我想使用 Oauth2+JWT 但同時無狀態來實現安全性,如下所示

3. OAuth2 + JWT + 無狀態

  • 用戶訪問 /
  • Springboot 標識為受保護資源並將用戶重定向到 /login
  • /login 被 Spring 安全攔截。 使用生成的狀態重定向到 Oauth2 授權服務器並將 URL 重定向回應用程序
  • 用戶輸入憑據
  • Oauth 服務器重定向回應用程序 URL“/login?code=xxx&state=yyy”
  • /login 被 Spring 安全攔截。 識別代碼和狀態,通過調用 OAuth2AuthenticationDetails.getTokenValue() 提取 JWT 令牌並在響應頭中設置。 重定向到 /
  • 瀏覽器加載/。 AngularJS 識別響應頭中的 JWT 令牌並將其存儲在 localStorage 中
  • 所有后續調用都將在標頭中包含 Bearer 令牌(通過 httpInterceptor 注入)

我想弄清楚如何實現上面突出顯示的步驟

只是一個想法/方向,如果我給你正確:您可以創建一個GenericFilterBean並添加到HttpSecurity過濾器鏈。

使用 JWT 時,應該有類似的東西(一個過濾器,它從頭中提取承載令牌),然后為 Spring Security 填充一個Authentication對象。

因此,新過濾器可以從請求中獲取令牌並相應地設置響應。 您還可以在不受保護的 (!) 回調端點中處理該問題,例如login/callback?... ,它會為您設置 cookie。

在我們的應用程序中,服務器(spring boot)是完全無狀態的,沒有任何 oauth 或有狀態的東西。 顯然,它從不重定向任何東西或有任何其他視圖/端點,而不是 AngularJS 的/ (以及/api/...下的一些 REST-API)。 因此,OAuth-flow 完全由 AngularJS 處理,AngularJS 反過來檢查來自 oauth-server 的回調並在本地設置 JWT-Token(就像你的第一種方法)。 在第一個版本中,我們還嘗試將重定向與無狀態 JWT 和有狀態會話等混為一談,但這導致登錄時出現非常奇怪的行為 - 狀態(已登錄或未登錄)並不總是清晰的,在某些情況下重定向是錯誤的等.

可能會幫助您實施所需的解決方案。

作者建議,一旦用戶成功通過 Oauth2 提供商(Google 等)進行身份驗證,您將一個短期令牌作為 URL 參數發送到您的前端應用程序,並使用此短期令牌將其交換為長期令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM