如何處理Token過期問題——全能開發工程師的解決方案

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:15
下一篇 2024-11-20 00:15

相關推薦

發表回復

登錄後才能評論