JWT
JWT全稱JSON Web Token,由三部分組成header(頭部,用於描述關於該JWT的最基本的信息,例如其類型以及簽名所用的算法等)、payload(載荷,就是存放有效信息的地方,在這一部分中存放過期時間)和signature(簽證,簽證信息)。
token
token就是后端生成的JWT字符串值,在前后端分離中,token是前端訪問后端接口的合法身份、權限的憑證。
token過期刷新方案
1、單點登錄
用戶登錄,后端驗證用戶成功之后生成兩個token,這兩個token分別是access_token(訪問接口使用的token)、refresh_token(access_token過期后用於刷續期的token,注意設置refresh_token的過期時間需比access_token的過期時間長),后端將用戶信息和這兩個token存放到redis中並返回給前端。
前端在獲取到登錄成功返回的兩個token之后,將之存放到localStorage本地存儲中。
2、接口請求
前端封裝統一接口請求函數、token刷新函數,在請求成功之后對返回結果進行校驗,如果token過期,則調用token刷新函數請求新的token.
后端在接收到token刷新請求之后通過結合redis中存放的用戶信息、token和refresh_token對請求參數進行驗證,驗證通過之后生成新的token和refresh_token存放到redis中並返回給前端。至此完成token刷新。
3、多請求應對
所謂多請求,就是指在短時間內同時發生多個請求,如果此時token已經過期,那么這些請求都會出現token過期請求失敗的情況。
為了避免反復刷新token,需要設置一個刷新token的開關isRefresh,當一個請求出現token過期的時候,這個時候會調用token刷新函數,與此同時關閉開關將isRefresh的值設置為false,避免后續請求去調用token刷新函數。
當發現token過期時,咱們將請求延緩到token刷新之后再重新執行請求,這里采用Promise函數,把每一個token失效的請求都存到一個Promise函數集合里面,當token刷新之后打開開關將isRefresh的值設置為true,然后批量執行Promise函數集合里面的Promise函數,返回請求結果。
