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.mzph.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 是一个开源的 内…