Token+JWT+Redis 實現鑒權機制

Token+JWT+Redis 實現鑒權機制

使用 Token、JWT 和 Redis 來實現鑒權機制是一種常見的做法,尤其適用于分布式應用或微服務架構。下面是一個大致的實現思路:

1. Token 和 JWT 概述

Token:通常是一個唯一的字符串,可以用來標識用戶的身份。
JWT (JSON Web Token):是一種自包含的、輕量級的認證方式。它由三個部分組成:
Header:包含算法信息(如 HMAC SHA256 或 RSA)和 Token 類型。
Payload:包含聲明信息(如用戶 ID、過期時間等)。
Signature:用于驗證 Token 是否被篡改。

2. Token + JWT + Redis 鑒權機制

這個機制大體分為以下幾個步驟:

步驟 1:用戶登錄并生成 JWT
  • 用戶輸入用戶名和密碼進行登錄。

  • 服務端驗證用戶信息(用戶名和密碼)是否正確。

  • 如果驗證通過,服務端生成 JWT Token:

      使用用戶的 ID、角色、權限等信息作為 Payload。設置過期時間(例如 1 小時)作為 Token 的有效期。使用一個密鑰(例如 secretKey)對 Token 進行簽名。
    

示例 JWT 生成代碼(Node.js + jsonwebtoken 庫):

const jwt = require('jsonwebtoken');const user = { id: 123, username: 'test' };  // 用戶信息
const secretKey = 'your_secret_key';  // 密鑰
const token = jwt.sign(user, secretKey, { expiresIn: '1h' });

服務端將生成的 Token 返回給客戶端,客戶端將 Token 存儲在本地(通常是 localStorage 或 sessionStorage)。

步驟 2:客戶端發送請求時攜帶 JWT

客戶端在每次請求時,將 Token 添加到 HTTP 請求頭中,通常是 Authorization 字段:

Authorization: Bearer <your_jwt_token>
步驟 3:服務端驗證 JWT

每次服務端收到請求時,會驗證請求頭中的 Token 是否有效。

服務端首先檢查 JWT 的簽名和過期時間:

使用密鑰驗證 JWT 的簽名。
如果 JWT 已經過期,拒絕請求,并提示重新登錄。
示例 JWT 驗證代碼:

try {const decoded = jwt.verify(token, secretKey);  // 解碼并驗證簽名console.log(decoded);  // decoded 包含用戶信息
} catch (error) {// 處理驗證失敗(如過期、無效等情況)res.status(401).send('Unauthorized');
}

除了驗證 JWT 本身,服務端還可以通過 Redis 來檢查 Token 是否在服務端有效。

步驟 4:使用 Redis 存儲和驗證 JWT

Redis 用于存儲和管理 JWT Token,特別是當需要支持 Token 黑名單、Token 強制失效等功能時。

存儲 JWT 到 Redis:
在用戶登錄時,將 JWT 存儲到 Redis,使用用戶 ID 或者 Token 本身作為鍵,設置一個過期時間與 JWT 的有效期一致。

示例代碼(Node.js + ioredis 庫):

const Redis = require('ioredis');
const redis = new Redis();// 假設 JWT 是 token,用戶 ID 是 user.id
redis.set(`token:${user.id}`, token, 'EX', 3600);  // 設置過期時間為 1 小時

驗證 Token 是否在 Redis 中:
在每次請求時,服務端可以通過 Redis 查找 Token 是否存在。如果 Token 不存在,說明用戶的 Token 已經失效(比如被登出或超時)。

示例代碼:

const tokenFromRequest = req.headers['authorization'].split(' ')[1];  // 獲取請求中的 Tokenredis.get(`token:${userId}`).then(redisToken => {if (!redisToken || redisToken !== tokenFromRequest) {// Token 不存在或已失效,返回 401return res.status(401).send('Unauthorized');}// Token 驗證通過,繼續處理請求next();
});
步驟 5:登出操作

登出操作:用戶主動登出時,服務端可以將該用戶的 Token 從 Redis 中刪除,確保該 Token 不能再被使用。

示例代碼:

redis.del(`token:${userId}`);

Token 過期:由于 Redis 存儲的 Token 設置了過期時間,當 Token 超過有效期時,Redis 會自動刪除該 Token。

3. 優勢和擴展

Token:能夠輕松支持無狀態的鑒權,不需要在每個請求中攜帶用戶的會話信息。
JWT:自包含的認證信息,不需要在服務器端存儲會話狀態,減少了數據庫壓力。
Redis:用于存儲和管理 Token,提供高效的訪問和強制失效控制。

總結

通過結合 Token、JWT 和 Redis,我們可以實現一個高效且可擴展的鑒權機制,支持無狀態認證、Token 過期控制、強制登出等功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77084.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RPC與其他通信技術的區別,以及RPC的底層原理

1、什么是 RPC&#xff1f; 遠程過程調用&#xff08;RPC&#xff09; 是一種協議&#xff0c;它允許程序在不同計算機之間進行通信&#xff0c;讓開發者可以像調用本地函數一樣發起遠程請求。 通過 RPC&#xff0c;開發者無需關注底層網絡細節&#xff0c;能夠更專注于業務邏…

簡潔的 PlantUML 入門教程

評論中太多朋友在問&#xff0c;我的文章中圖例如何完成的。 我一直用plantUML,也推薦大家用&#xff0c;下面給出一個簡潔的PlantUML教程。 &#x1f331; 什么是 PlantUML&#xff1f; PlantUML 是一個用純文本語言畫圖的工具&#xff0c;支持流程圖、時序圖、用例圖、類圖、…

互聯網三高-高性能之JVM調優

1 運行時數據區 JVM運行時數據區是Java虛擬機管理的內存核心模塊&#xff0c;主要分為線程共享和線程私有兩部分。 &#xff08;1&#xff09;線程私有 ① 程序計數器&#xff1a;存儲當前線程執行字節碼指令的地址&#xff0c;用于分支、循環、異常處理等流程控制? ② 虛擬機…

淺談StarRocks 常見問題解析

StarRocks數據庫作為高性能分布式分析數據庫&#xff0c;其常見問題及解決方案涵蓋環境部署、數據操作、系統穩定性、安全管控及生態集成五大核心領域&#xff0c;需確保Linux系統環境、依賴庫及環境變量配置嚴格符合官方要求以避免節點啟動失敗&#xff0c;數據導入需遵循格式…

P1332 血色先鋒隊(BFS)

題目背景 巫妖王的天災軍團終于卷土重來&#xff0c;血色十字軍組織了一支先鋒軍前往諾森德大陸對抗天災軍團&#xff0c;以及一切沾有亡靈氣息的生物。孤立于聯盟和部落的血色先鋒軍很快就遭到了天災軍團的重重包圍&#xff0c;現在他們將主力只好聚集了起來&#xff0c;以抵…

大文件上傳之斷點續傳實現方案與原理詳解

一、實現原理 文件分塊&#xff1a;將大文件切割為固定大小的塊&#xff08;如5MB&#xff09; 進度記錄&#xff1a;持久化存儲已上傳分塊信息 續傳能力&#xff1a;上傳中斷后根據記錄繼續上傳未完成塊 塊校驗機制&#xff1a;通過哈希值驗證塊完整性 合并策略&#xff1a;所…

【動手學深度學習】卷積神經網絡(CNN)入門

【動手學深度學習】卷積神經網絡&#xff08;CNN&#xff09;入門 1&#xff0c;卷積神經網絡簡介2&#xff0c;卷積層2.1&#xff0c;互相關運算原理2.2&#xff0c;互相關運算實現2.3&#xff0c;實現卷積層 3&#xff0c;卷積層的簡單應用&#xff1a;邊緣檢測3.1&#xff0…

Opencv計算機視覺編程攻略-第十一節 三維重建

此處重點討論在特定條件下&#xff0c;重建場景的三維結構和相機的三維姿態的一些應用實現。下面是完整投影公式最通用的表示方式。 在上述公式中&#xff0c;可以了解到&#xff0c;真實物體轉為平面之后&#xff0c;s系數丟失了&#xff0c;因而無法會的三維坐標&#xff0c;…

大廠不再招測試?軟件測試左移開發合理嗎?

&#x1f449;目錄 1 軟件測試發展史 2 測試左移&#xff08;Testing shift left&#xff09; 3 測試右移&#xff08;Testing shift right&#xff09; 4 自動化測試 VS 測試自動化 5 來自 EX 測試的寄語 最近兩年&#xff0c;互聯網大廠的招聘中&#xff0c;測試工程師崗位似…

windows10下PointNet官方代碼Pytorch實現

PointNet模型運行 1.下載源碼并安裝環境 GitCode - 全球開發者的開源社區,開源代碼托管平臺GitCode是面向全球開發者的開源社區,包括原創博客,開源代碼托管,代碼協作,項目管理等。與開發者社區互動,提升您的研發效率和質量。https://gitcode.com/gh_mirrors/po/pointnet.pyto…

git pull 和 git fetch

關于 git pull 和 git fetch 的區別 1. git fetch 作用&#xff1a;從遠程倉庫獲取最新的分支信息和提交記錄&#xff0c;但不會自動合并或修改當前工作目錄中的內容。特點&#xff1a; 它只是更新本地的遠程分支引用&#xff08;例如 remotes/origin/suyuhan&#xff09;&am…

前端開發中的單引號(‘ ‘)、雙引號( )和反引號( `)使用

前端開發中的單引號&#xff08;’ &#xff09;、雙引號&#xff08;" "&#xff09;和反引號&#xff08; &#xff09;使用 在前端開發中&#xff0c;單引號&#xff08;’ &#xff09;、雙引號&#xff08;" "&#xff09;和反引號&#xff08; &…

程序化廣告行業(69/89):DMP與PCP系統核心功能剖析

程序化廣告行業&#xff08;69/89&#xff09;&#xff1a;DMP與PCP系統核心功能剖析 在數字化營銷浪潮中&#xff0c;程序化廣告已成為企業精準觸達目標受眾的關鍵手段。作為行業探索者&#xff0c;我深知其中知識的繁雜與重要性。一直以來&#xff0c;都希望能和大家一同學習…

Amodal3R ,南洋理工推出的 3D 生成模型

Amodal3R 是一款先進的條件式 3D 生成模型&#xff0c;能夠從部分可見的 2D 物體圖像中推斷并重建完整的 3D 結構與外觀。該模型建立在基礎的 3D 生成模型 TRELLIS 之上&#xff0c;通過引入掩碼加權多頭交叉注意力機制與遮擋感知注意力層&#xff0c;利用遮擋先驗知識優化重建…

LLM面試題八

推薦算法工程師面試題 二分類的分類損失函數&#xff1f; 二分類的分類損失函數一般采用交叉熵(Cross Entropy)損失函數&#xff0c;即CE損失函數。二分類問題的CE損失函數可以寫成&#xff1a;其中&#xff0c;y是真實標簽&#xff0c;p是預測標簽&#xff0c;取值為0或1。 …

30天學Java第7天——IO流

概述 基本概念 輸入流&#xff1a;從硬盤到內存。&#xff08;輸入又叫做 讀 read&#xff09;輸出流&#xff1a;從內存到硬盤。&#xff08;輸出又叫做 寫 write&#xff09;字節流&#xff1a;一次讀取一個字節。適合非文本數據&#xff0c;它是萬能的&#xff0c;啥都能讀…

面試可能會遇到的問題回答(嵌入式軟件開發部分)

寫在前面&#xff1a; 博主也是剛入社會的小牛馬&#xff0c;如果下面有寫的不好或者寫錯的地方歡迎大家指出~ 一、四大件基礎知識 1、計算機組成原理 &#xff08;1&#xff09;簡單介紹一下中斷是什么。 ①回答&#xff1a; ②難度系數&#xff1a;★★ ③難點分析&…

層歸一化詳解及在 Stable Diffusion 中的應用分析

在深度學習中&#xff0c;歸一化&#xff08;Normalization&#xff09;技術被廣泛用于提升模型訓練的穩定性和收斂速度。本文將詳細介紹幾種常見的歸一化方式&#xff0c;并重點分析它們在 Stable Diffusion 模型中的實際使用場景。 一、常見的歸一化技術 名稱歸一化維度應用…

深入理解Socket編程:構建簡單的計算器服務器

一、Socket通信基礎 1. Socket通信基本流程 服務器端流程&#xff1a; 創建Socket (socket()) 綁定地址和端口 (bind()) 監聽連接 (listen()) 接受連接 (accept()) 數據通信 (read()/write()) 關閉連接 (close()) 客戶端流程&#xff1a; 創建Socket (socket()) 連接…

Redis-x64-3.2.100.msi : Windows 安裝包(MSI 格式)安裝步驟

Redis-x64-3.2.100.msi 是 Redis 的 Windows 安裝包&#xff08;MSI 格式&#xff09;&#xff0c;適用于 64 位系統。 在由于一些環境需要低版本的Redis的安裝包。 Redis-x64-3.2.100.msi 安裝包下載&#xff1a;https://pan.quark.cn/s/cc4d38262a15 Redis 是一個開源的 內…