一、JWT退出登錄概述
JWT(JSON Web Token)是一種輕量級的認證和授權機制,常用於RESTful API服務中。用戶在登錄成功後,伺服器會對用戶進行認證並生成一個JWT返回給客戶端,客戶端在每次請求時需要帶上JWT,服務端通過校驗JWT來確定該用戶的身份和許可權。
但是,當用戶需要退出登錄時,客戶端和服務端都需要清除該JWT。本文將從多個方面詳細闡述JWT如何退出登錄。
二、清除Token
當用戶註銷或退出登錄時,客戶端需要清除本地存儲的JWT。
//客戶端代碼示例 localStorage.removeItem("jwtToken");
服務端不需要做出任何改變,因為JWT是存放在客戶端的。
三、JWT如何退出登錄
1. JWT的過期時間
為了增強JWT的安全性,通常會設置一個過期時間,一旦超過這個時間,客戶端需要重新獲取JWT。因此,退出登錄可以通過設置JWT的過期時間來實現。
//服務端代碼示例 const token = jwt.sign({ //生成JWT user_id: 123, exp: Math.floor(Date.now() / 1000) + (60 * 60), //設置過期時間 }, 'jwt_secret_key');
當用戶退出登錄時,服務端可以設置JWT的過期時間為當前時間戳,這樣既可以強制清除JWT,也可以避免JWT被惡意利用。
2. JWT的黑名單
為了增強JWT的可控性,可以創建一個JWT黑名單來存儲已經失效的JWT,當客戶端請求時,服務端可以檢查該JWT是否在黑名單中。
//服務端代碼示例 const blacklist = []; app.post('/logout', function (req, res) { const { token } = req.body; blacklist.push(token); //將該JWT加入黑名單 res.send('Logout Successfully'); }); app.get('/user', function (req, res) { const { token } = req.headers; if (blacklist.indexOf(token) !== -1) { //若該JWT在黑名單中,禁止訪問 res.status(401).send('Token Expired'); } else { //獲取用戶信息 } });
當用戶退出登錄時,客戶端向服務端發送一個請求,將該JWT加入黑名單中。當客戶端再次請求時,服務端會檢查該JWT是否在黑名單中,若在,則拒絕該請求。
3. JWT撤銷機制
為了進一步增強JWT的可控性,並且避免新的JWT被惡意利用,可以引入JWT的撤銷機制。該機制允許管理員撤銷某個用戶的JWT,當客戶端請求時,服務端檢查該JWT是否在撤銷列表中。
//服務端代碼示例 const revocationList = []; app.post('/revoke', function (req, res) { const { user_id } = req.body; revocationList.push(user_id); //將該用戶的JWT撤銷 res.send('Revoke Successfully'); }); app.get('/user', function (req, res) { const { token } = req.headers; const decoded = jwt.verify(token, 'jwt_secret_key'); if (revocationList.indexOf(decoded.user_id) !== -1) { //若該用戶的JWT已被撤銷,禁止訪問 res.status(401).send('Token Revoked'); } else { //獲取用戶信息 } });
管理員可以通過發送一個請求來撤銷某個用戶的JWT。當客戶端再次請求時,服務端會檢查該JWT對應的用戶是否在撤銷列表中,若在,則拒絕該請求。
四、總結
JWT的退出登錄需要清除Token以及對JWT的處理。通過設置JWT的過期時間、創建JWT的黑名單和引入JWT撤銷機制,可以增強JWT的可控性和安全性。
原創文章,作者:FOVAT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369123.html