首页 > web前端 > js教程 > 使用黑名单和 Redis 管理 JWT 注销:初学者友好指南

使用黑名单和 Redis 管理 JWT 注销:初学者友好指南

Patricia Arquette
发布: 2025-01-05 14:29:40
原创
204 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板