token 過期后,如何自動續(xù)期?
點擊關注公眾號,回復“2T”獲取2TB學習資源!
互聯(lián)網架構師后臺回復 2T 有特別禮包
來源:toutiao.com/article/6995179162675790350
JWT token的 payload 部分是一個json串,是要傳遞數(shù)據(jù)的一組聲明,這些聲明被JWT標準稱為claims。
JWT標準里面定義的標準claim包括:
iss(Issuser):JWT的簽發(fā)主體; sub(Subject):JWT的所有者; aud(Audience):JWT的接收對象; exp(Expiration time):JWT的過期時間; nbf(Not Before):JWT的生效開始時間; iat(Issued at):JWT的簽發(fā)時間; jti(JWT ID):是JWT的唯一標識。
除了以上標準聲明以外,我們還可以自定義聲明。以 com.auth0 為例,下面代碼片段實現(xiàn)了生成一個帶有過期時間的token.
String token = JWT.create().withIssuer(ISSUER).withIssuedAt(new Date(currentTime))// 簽發(fā)時間.withExpiresAt(new Date(currentTime + EXPIRES_IN * 1000 * 60))// 過期時間戳.withClaim("username", username)//自定義參數(shù).sign(Algorithm.HMAC256(user.getPassword()));
其中:
withIssuer() 設置簽發(fā)主體; withIssuedAt() 設置簽發(fā)時間; withExpiresAt() 設置過期時間戳,過期的時長為 EXPIRES_IN (單位秒); withClaim() 設置自定義參數(shù)。
JWT設置了過期時間以后,一定超過,那么接口就不能訪問了,需要用戶重新登錄獲取token。如果經常需要用戶重新登錄,顯然這種體驗不是太好,因此很多應用會采用token過期后自動續(xù)期的方案,只有特定條件下才會讓用戶重新登錄。
token過期的續(xù)期方案
解決token過期的續(xù)期問題可以有很多種不同的方案,這里舉一些比較有代表性的例子。首先我們看一個單token方案,這個方案除了可以實現(xiàn)token續(xù)期以外,還可以實現(xiàn)某些條件下的強制重新登錄。
單token方案

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

微信網頁授權方案
用戶在第三方應用的網頁上完成微信授權以后,第三方應用可以獲得 code(授權碼)。code的超時時間為10分鐘,一個code只能成功換取一次access_token即失效。
access_token是調用授權關系接口的調用憑證,由于access_token有效期(2個小時)較短,當access_token超時后,可以使用refresh_token進行刷新。
后端實現(xiàn)token過期還可以利用Redis來存儲token,設置redis的鍵值對的過期時間。如果發(fā)現(xiàn)redis中不存在token的記錄,說明token已經過期了。
-End-
正文結束
1.心態(tài)崩了!稅前2萬4,到手1萬4,年終獎扣稅方式1月1日起施行~

