![](/img/trans.png)
[英]How to achieve long lived login session with Oauth2 and javascript client(Spring Oauth2 + Angularjs)
[英]Springboot + JWT +OAuth2 + AngularJS Stateless session
我正在嘗試各種基於 Java Spring 的安全實現,如下所示
1. JWT 認證
注意:無狀態會話
2.OAuth2認證
@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 並識別用戶
現在我想使用 Oauth2+JWT 但同時無狀態來實現安全性,如下所示
3. OAuth2 + JWT + 無狀態
- /login 被 Spring 安全攔截。 識別代碼和狀態,通過調用 OAuth2AuthenticationDetails.getTokenValue() 提取 JWT 令牌並在響應頭中設置。 重定向到 /
題
我想弄清楚如何實現上面突出顯示的步驟
只是一個想法/方向,如果我給你正確:您可以創建一個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.