首頁 > web前端 > js教程 > 使用黑名單和 Redis 管理 JWT 註銷:初學者友好指南

使用黑名單和 Redis 管理 JWT 註銷:初學者友好指南

Patricia Arquette
發布: 2025-01-05 14:29:40
原創
172 人瀏覽過

Managing JWT Logout with Blacklists and Redis: A Beginner-Friendly Guide

使用 JWT(JSON Web 令牌)建立安全 API 時,處理使用者登出可能會很棘手。由於 JWT 是無狀態的,因此沒有現成的方法可以在註銷後使令牌失效。這就是黑名單和 Redis 等工具發揮作用的地方。如果您對這些概念不熟悉,請不要擔心!本指南將逐步解釋一切,並協助您實施實用的解決方案。

了解無狀態性和 JWT

無狀態系統

  • 無狀態系統不在伺服器上儲存任何使用者會話資訊。
  • 每個請求都攜帶伺服器處理它所需的所有必要資料(例如 JWT)。

智威湯遜

  • JWT 包含使用者資料(如 ID 和角色)並由伺服器簽署。
  • 一旦發布,伺服器不需要儲存令牌或會話詳細資訊。
  • 問題:如果使用者註銷,他們的 JWT 仍然有效,直到過期。

什麼是黑名單?

黑名單是已失效的代幣列表。當用戶登出時,他們的令牌將添加到此列表中。每次發出請求時,伺服器都會檢查該令牌是否在黑名單中。如果是,則請求被拒絕。

實施黑名單的步驟:

  1. 將無效的標記儲存在資料結構(例如陣列、Set 或資料庫)中。
  2. 處理請求時,驗證token不在黑名單中。
  3. 加入清理機制,將過期代幣從黑名單中刪除。

為什麼是 Redis?

Redis 是一個高效能的記憶體鍵值資料庫。它非常適合將 JWT 列入黑名單等用例,因為:

  • 速度:Redis 每秒可以處理數千次讀取/寫入操作。
  • 分散式:多個伺服器可以共用同一個Redis實例以實現資料一致。
  • TTL(存活時間):Redis 可以在指定的持續時間後自動刪除條目。

如何在沒有 Redis 的情況下開始

如果您對這些概念不熟悉,請從簡單的記憶體解決方案開始:

const blacklist = new Set();

// Add token to blacklist
authController.logout = (req, res) => {
  const token = req.headers.authorization.split(" ")[1];
  blacklist.add(token);
  res.status(200).json({ message: "Logged out successfully" });
};

// Middleware to check token validity
middleware.verifyToken = (req, res, next) => {
  const token = req.headers.authorization.split(" ")[1];
  if (blacklist.has(token)) {
    return res.status(401).json({ message: "Invalid token" });
  }
  next();
};
登入後複製
登入後複製

這種方法適用於小型項目,但有其限制。如果您的應用程式可擴展,您將需要更強大的解決方案,例如 Redis。

Redis 入門

1.安裝Redis

  • 本地安裝Redis:Redis安裝指南
  • 或者,使用 AWS Elasticache 或 Redis Cloud 等雲端服務。

2.在Node.js中整合Redis

使用 ioredis 函式庫與 Node.js 應用程式中的 Redis 互動:

const blacklist = new Set();

// Add token to blacklist
authController.logout = (req, res) => {
  const token = req.headers.authorization.split(" ")[1];
  blacklist.add(token);
  res.status(200).json({ message: "Logged out successfully" });
};

// Middleware to check token validity
middleware.verifyToken = (req, res, next) => {
  const token = req.headers.authorization.split(" ")[1];
  if (blacklist.has(token)) {
    return res.status(401).json({ message: "Invalid token" });
  }
  next();
};
登入後複製
登入後複製
npm install ioredis
登入後複製

Redis 與記憶體中

Feature In-Memory (Set) Redis
Scalability Limited to a single server Distributed across servers
Speed Very fast Equally fast
Persistence Lost on server restart Data persists across restarts
Cleanup Manual Automatic with TTL

下一步

  • 學習 Redis 基礎:了解 SETEX、GET 和 DEL 等指令。
  • 安全 Redis:使用驗證和 IP 白名單。
  • 最佳化黑名單:僅儲存令牌雜湊以增加安全性。

從簡單的記憶體解決方案開始,逐漸過渡到 Redis,確保您不會不知所措。快樂編碼!


如果您對 Redis 設定有任何疑問或需要協助,請在評論中告訴我。 ?

以上是使用黑名單和 Redis 管理 JWT 註銷:初學者友好指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板