Spring Cloud微服務安全實戰_5-6_refresh token失效處理


access_token是客戶端調用其他微服務調的憑證,access_token有效期不能太長(丟了風險很大),一般可以設置2小時,如果access_token失效了,就不能調用微服務了,上節說了access_token失效的處理---refresh_token來刷新令牌,refresh_token可以設置很長的有效期,比如一個月

下面是用refresh_token刷新令牌的步驟:

1,配置refresh_token

 在客戶端應用的表里配置 refresh_token 的有效期,然后配置refresh_token授權模式,這樣認證服務器在給客戶端應用發access_token的同時,也會發一個refresh_token 

(圖1)

 

 2, 在客戶端應用調用微服務時,從session中拿出token,判token是否過期(在存入session時已經設置了token的過期時間),如果token已過期,就從拿refresh_token換取access_token:

 (圖2)

如果refresh_token也過期了怎么處理呢?

雖然refresh_token有效期很長(比如一個月)但是還是會過期的。如果refresh_token也過期了怎么辦呢?

答案是:沒辦法。只能去認證服務器走一遍認證流程。

當重新去認證服務器走授權流程的時候,又分兩種情況:

1,refresh_token雖然過期了,但是認證服務器上的session還沒過期,走認證流程的時候,認證服務器直接返回一個令牌給客戶端應用。

2,refresh_token雖然過期了,認證服務器上的session也過期了,那就必須讓用戶輸入用戶名密碼,進行重新登錄。

情況1可以控制讓用戶重新輸入用戶名密碼進行重新登錄,一旦refresh_token過期了,走一遍退出流程,讓用戶重新登錄(我感覺這樣挺好,見過很多應用app也是,一個月登錄就失效了)

開始實驗

1,客戶端應用代碼

直到上節為止,架構是這樣的:在認證服務器登錄成功后,客戶端應用將認證服務器返回的token存到了自己的session,當調用微服務時,從session中拿出token,放在請求頭。如果token已經過期了,就拿refresh_token去認證服務器刷新令牌,然后將新獲取的token存到自己的session,並攜帶新的token去調用微服務。(如圖1),刷新令牌失效會哪個地方發生?就在拿着refresh_token去刷新令牌的時候,refresh_token 可以也已經過期,此時就要捕獲到這個異常,在刷新令牌的時候,發現refresh_token也過期了,就返回給前端一個500響應碼和一個錯誤信息,前端拿到這個響應碼,就去認證服務器走一遍退出流程,讓用戶徹底退出系統。

圖1改造后的代碼如下所示

 

 

 (圖3)

2,表配置

在客戶端應用里,將admin應用的token有效期設為10秒,refresh_token 有效期設為20秒。這樣登錄后10秒后,token就失效了,再調用訂單服務,就會走上邊說的刷新token代碼,直到20秒后,刷新令牌也失效了,給前端一個錯誤碼500和一個message,前端全局攔截這個錯誤,調用退出方法。

 

 

 3,前端代碼

搞一個全局攔截器,攔截refresh_token失效的響應,因為調用任何服務,都可能返回這個錯誤響應。

這里使用jquery做的實驗(我不會vue和angular),如果是vue獲取angular等目前比較流行的框架,思路也是一樣的。

 

 

 4,現象

啟動幾個微服務,登錄后調用訂單服務,正常

 

 

 token 10秒過期后,refresh_token起效了,刷新了令牌

 20秒后,調用訂單服務,自動走退出流程,跳轉admin應用的登錄頁

 

 

 如果refresh_token 失效,還想去認證服務器看看認證服務器的session失效沒失效,那就在全局攔截出改成如下代碼(我感覺這種體驗並不好):

 

 

 本節github代碼:https://github.com/lhy1234/springcloud-security/tree/chapt-5-6-refreshtoken-expired  寫文章不易,如果對你有幫助了,給個小星星吧!

 

 

歡迎關注個人公眾號一起交流學習:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM