一、什麼是Jwt Refresh Token
Json Web Token(JWT)是一種在網絡間傳輸信息的方式,常用於身份驗證和授權。使用JWT需要在客戶端使用密鑰對數據進行簽名,然後將令牌發回服務器以進行驗證。但是,如果需要長時間訪問某些內容,許多身份驗證和授權令牌將過期。JWT Refresh Token允許客戶端在過期的JWT之前提供一個新的JWT令牌。
JWT Refresh Token是一種標準的身份驗證令牌,它允許客戶端在過期之前自動重新生成新的令牌,而不需要進行用戶重新登錄或者授權。
二、Jwt Refresh Token 的工作原理
JWT是一種聲明式的身份驗證/授權機制,它由三部分組成:頭部、載荷和簽名。第一部分是頭部,用於指定JWT類型和使用的簽名算法。第二部分是載荷,包含有關用戶的信息和其他元數據。第三部分是簽名,用於驗證JWT的完整性。這三個部分都是使用Base64進行編碼的。
現在,假設在JWT令牌中有一個稱為設置Refresh Token的字段,值為true。當該令牌在過期之前發現時,可以使用令牌中包含的“Refresh Token”生成新的JWT令牌並發送給客戶端。
以下是JWT和Refresh Token工作的簡要流程:
1.使用服務器端密鑰和其他信息為JWT生成令牌。
2.返回JWT令牌和Refresh Token
3.客戶端記錄令牌和Refresh Token,並在每個之間進行快速切換。
4.當JWT令牌過期時,客戶端使用Refresh Token請求新的JWT令牌。
5.刷新新的JWT令牌並繼續使用。
三、Jwt Refresh Token 的優勢
使用JWT Refresh Token有幾個優點:
1.頒髮長期有效的訪問令牌。使用Refresh Token可以將訪問令牌的有效期延長到較長的時間。
2.降低服務器負載。使用Refresh Token可以減少對服務器的訪問,因為客戶端可以在一段時間內自行處理驗證和更新令牌。
3.提高安全性。使用Refresh Token可以減少發生中間人攻擊的機會,因為JWT令牌有效期非常短,而Refresh Token有效期長。
四、如何實現Jwt Refresh Token
實現JWT Refresh Token需要進行以下步驟:
1.創建初始JWT令牌
const jwt = require('jsonwebtoken'); const jwtKey = 'your_jwt_secret';//jwt密鑰 const jwtExpirySeconds = 300; //JWT Token的有效期為5分鐘 const userName = 'your_username';//用戶名稱 const token = jwt.sign({ userName }, jwtKey, { algorithm: 'HS256', expiresIn: jwtExpirySeconds });
2.生成Refresh Token
為每個JWT令牌生成一個Refresh Token,用於在令牌到期之前獲取新的令牌。
const RefreshToken = require('../models/refresh-token.model');//引入 RefreshToken 模型 const generateRefreshToken = async (userName) => { const refreshToken = new RefreshToken({ userName: userName, token: crypto.randomBytes(40).toString('hex'), //生成一個40位的隨機Refresh Token expires: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) //Refresh Token有效期7天 }); await refreshToken.save(); return refreshToken; }
3.驗證JWT令牌並生成新的JWT令牌
const verify = require('./verify');//引入 JWT 驗證方法 const refreshToken = async (oldToken) => { const oldDecodedToken = jwt.decode(oldToken); const refreshToken = await RefreshToken.findOne({ userName: oldDecodedToken.userName }); if (!refreshToken) return;//傳遞的舊Token的refreshToken不存在 //驗證RefreshToken是否過期 if (refreshToken.expires.valueOf() < Date.now()) { await refreshToken.remove();//刪除RefreshToken return;//refreshToken已過期 } //驗證JWT令牌的簽名,以確保它沒有被改變 const { algorithm } = jwt.decode(oldToken, { complete: true }).header; await verify(oldToken, jwtKey, algorithm); const newToken = jwt.sign({ userName: oldDecodedToken.userName }, jwtKey, { algorithm: algorithm,//使用相同的算法 expiresIn: jwtExpirySeconds }); return newToken; }
4.使用Refresh Token獲取新的JWT令牌
const express = require('express'); const router = express.Router(); const RefreshToken = require('../models/refresh-token.model'); const jwtRefreshToken = require('../middleware/jwt-refreshtoken.middleware'); const jwt = require('jsonwebtoken'); const jwtKey = 'your_jwt_secret';//jwt密鑰 router.post('/', jwtRefreshToken, async (req, res) => { try { const oldToken = req.token;//傳遞的舊的JWT令牌 const newToken = await refreshToken(oldToken);//生成新的JWT令牌 if (!newToken) { res.status(401).send("Unauthorized");//新的JWT令牌被拒絕 return; } res.json({ token: newToken });//發送新的JWT令牌 } catch (err) { res.status(500).send(err);//服務器錯誤 } }); module.exports = router;
五、總結
Jwt Refresh Token 是一種長期有效的身份驗證令牌,可以提高客戶端的使用體驗,降低服務器負載和提高安全性。實現 JWT Refresh Token 具有重要的意義,需要根據具體的業務需求進行定製化開發。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/206089.html