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