很多朋友想了解關於token失效怎麽解決的一些資料信息,下麵是(揚升資訊www.balincan8.com)小編整理的與token失效怎麽解決相關的內容分享給大家,一起來看看吧。
前麵一篇文章《Java麵試常見問題:如何實現基於JWT的登錄認證》介紹了基於SpringBoot實現JWT登錄認證的基本思路,我們使用了com.auth0 這樣一個JWT實現。
在文中給出的例子中,僅實現了登錄認證,但是並沒有設置token的過期時間,在實際應用中,token一般都需要設置過期時間。
如何設置token的過期時間前文《Java麵試常見問題:JWT是什麽?》介紹過,JWT token的 payload 部分是一個json串,是要傳遞數據的一組聲明,這些聲明被JWT標準稱為claims。
JWT標準裏麵定義的標準claim包括:
iss(Issuser):JWT的簽發主體;sub(Subject):JWT的所有者;aud(Audience):JWT的接收對象;exp(Expiration time):JWT的過期時間;nbf(Not Before):JWT的生效開始時間;iat(Issued at):JWT的簽發時間;jti(JWT ID):是JWT的唯一標識。除了以上標準聲明以外,我們還可以自定義聲明。以 com.auth0 為例,下麵代碼片段實現了生成一個帶有過期時間的token.
String token = JWT.create() .withIssuer(ISSUER) .withIssuedAt(new Date(currentTime))// 簽發時間 .withExpiresAt(new Date(currentTime + EXPIRES_IN * 1000 * 60))// 過期時間戳 .withClaim("username", username)//自定義參數 .sign(Algorithm.HMAC256(user.getPassword()));其中:
withIssuer() 設置簽發主體;withIssuedAt() 設置簽發時間;withExpiresAt() 設置過期時間戳,過期的時長為 EXPIRES_IN (單位秒);withClaim() 設置自定義參數。JWT設置了過期時間以後,一定超過,那麽接口就不能訪問了,需要用戶重新登錄獲取token。如果經常需要用戶重新登錄,顯然這種體驗不是太好,因此很多應用會采用token過期後自動續期的方案,隻有特定條件下才會讓用戶重新登錄。
token過期的續期方案解決token過期的續期問題可以有很多種不同的方案,這裏舉一些比較有代表的例子。首先我們看一個單token方案,這個方案除了可以實現token續期以外,還可以實現某些條件下的強製重新登錄。
單token方案

單token方案實現token續期
將 token 過期時間設置為15分鍾;前端發起請求,後端驗證 token 是否過期;如果過期,前端發起刷新token請求,後端為前端返回一個新的token;前端用新的token發起請求,請求成功;如果要實現每隔72小時,必須重新登錄,後端需要記錄每次用戶的登錄時間;用戶每次請求時,檢查用戶最後一次登錄日期,如超過72小時,則拒絕刷新token的請求,請求失敗,跳轉到登錄頁麵。另外後端還可以記錄刷新token的次數,比如最多刷新50次,如果達到50次,則不再允許刷新,需要用戶重新授權。
上麵介紹的單token方案原理比較簡單。下麵我們再看一個雙token方案。
雙token方案
登錄成功以後,後端返回 access_token 和 refresh_token,客戶端緩存此兩種token;使用 access_token 請求接口資源,成功則調用成功;如果token超時,客戶端攜帶 refresh_token 調用token刷新接口獲取新的 access_token;後端接受刷新token的請求後,檢查 refresh_token 是否過期。如果過期,拒絕刷新,客戶端收到該狀態後,跳轉到登錄頁;如果未過期,生成新的 access_token 返回給客戶端。客戶端攜帶新的 access_token 重新調用上麵的資源接口。客戶端退出登錄或修改密碼後,注銷舊的token,使 access_token 和 refresh_token 失效,同時清空客戶端的 access_token 和 refresh_toke。微信網頁授權是通過OAuth2.0機製實現的,也使用了雙token方案。

微信網頁授權
微信網頁授權方案
用戶在第三方應用的網頁上完成微信授權以後,第三方應用可以獲得 code(授權碼)。code的超時時間為10分鍾,一個code隻能成功換取一次access_token即失效。第三方應用通過code獲取網頁授權憑證access_token和刷新憑證 refresh_token。access_token是調用授權關係接口的調用憑證,由於access_token有效期(2個小時)較短,當access_token超時後,可以使用refresh_token進行刷新。refresh_token擁有較長的有效期(30天),當refresh_token失效的後,需要用戶重新授權。後端實現token過期還可以利用Redis來存儲token,設置redis的鍵值對的過期時間。如果發現redis中不存在token的記錄,說明token已經過期了。
我會持續更新關於物聯網、雲原生以及數字科技方麵的文章,用簡單的語言描述複雜的技術,也會偶爾發表一下對IT產業的看法,請大家多多關注,歡迎留言和轉發,希望與大家互動交流,謝謝。
本文到此結束,希望對大家有所幫助呢。