Token是指代表著用戶身份的字元串,當用戶進行登錄認證後,系統會生成並返回一個Token,以後用戶的每一次請求都需要攜帶該Token以便伺服器對其進行身份校驗。然而,Token的過期問題是一個需要我們開發人員重視的問題。本文將從多個方面介紹如何處理Token過期問題,給出詳細的解決方案。
一、Token過期的原因
1、用戶長時間未進行操作,導致Token失效;
2、Token設置的過期時間到期;
3、伺服器端的Token存儲出現異常。
對於以上原因,我們可以分別進行處理:
二、方案1:Token超時處理
當用戶在一段時間內沒有進行任何操作,Token就可能失效。解決方法是通過設置一個超時時間,在規定時間內用戶沒有任何操作則Token失效,需要重新登錄獲取新的Token,從而保證安全性。
1.在後台伺服器設置Token超時時間
//token過期時間:30min const EXPIRE_TIME=30*60*1000;
2.前端請求時校驗Token是否過期
let timestamp=Date.now();
let expireTime=localStorage.getItem('expireTime');
if(timestamp-expireTime>EXPIRE_TIME){
console.log('Token已過期,請重新登錄!');
logout();//退出登錄
}else{
//繼續請求操作
}
在請求前需要通過localStorage獲取Token的過期時間expireTime,與伺服器的當前時間進行比較。若當前時間與過期時間差值大於Token過期時間,則Token失效,需要重新登錄,退出當前操作。
三、方案2:禁止多處登錄
當用戶進行多處登錄時,Token也會過期,此時需要提示用戶當前設備已登錄,禁止重複登錄。
1.記錄Token登錄狀態
/**
* 記錄Token是否已經登錄
* @param {*} token
*/
export function setTokenLoginStatus(token, status = true) {
localStorage.setItem(`token_status_${token}`, status);
}
2.檢查Token當前是否已經登錄
/**
* 檢查Token當前是否已經登錄
* @param {*} token
* @returns
*/
export function checkTokenLoginStatus(token) {
return !!localStorage.getItem(`token_status_${token}`);
}
通過localStorage記錄每個Token的登錄狀態。當用戶進行多處登錄時,後面的登錄會將前面的登錄Token狀態覆蓋,此時需要提示用戶當前設備已登錄,禁止重複登錄。
四、方案3:Token過期自動刷新
Token過期,用戶需要重新登錄獲取新的Token,這一過程可能會影響用戶體驗。為了解決這個問題,可以通過定期刷新獲取新的Token,從而保證Token一直有效。
1.前端定期刷新Token
let refreshInterval=50*60*1000;//若前端的Token存在超過50min,定期向伺服器請求刷新Token
setInterval(()=>{
refreshToken();
},refreshInterval);
在前端定期刷新Token,若當前Token存在超過規定時間(例如50min),自動向伺服器請求刷新Token。此時需要注意,Token刷新的過程要保證前後端的操作的一致性,尤其是在Token刷新存在失敗邏輯時需要加入錯誤處理。
2.後端Token刷新介面
/**
* 刷新Token介面:請求之前需要校驗Token過期,通過後則生成新的Token,並存儲至Token中
* @param req
* @param res
* @returns {Promise}
*/
async function refreshToken(req, res) {
const token = req.session.token;
const tokenInfo = await verifyToken(token);
const { payload } = tokenInfo;
const { userId, username, platforms, appid } = payload;
let newToken = generateToken(userId, username, platforms, appid);
await saveToken(newToken, userId);
res.json({
code: '000000',
message: 'refresh token success!',
payload: newToken
});
}
在後端編寫刷新Token介面,需要先對原Token進行信息解密,獲取到原Token所代表的用戶信息,然後生成新Token存儲至Token中,同時返回給前端。這裡需注意,新Token的存儲需要替換原Token,以保證Token的一致性,用戶不必重新登錄。
五、結語
Token過期問題是一個需要開發者思考和解決的實際問題。本文介紹了多種方案:設置Token超時時間、禁止多處登錄、定期刷新Token。對於Token過期自動刷新,一定要在前後端操作的一致性上保證,同時還需注意錯誤處理。通過這些方案,可以使得Token問題得到良好的解決和管理,為後續的開發操作提供了良好的基礎和保障。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159690.html
微信掃一掃
支付寶掃一掃