jwt在express中token的加密解密实现方法
在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后,今天来详细学习一下token是如何生成的,secret密钥的加密解密过程是怎么样的。
安装依赖
- express:用于创建服务器
- jsonwebtoken:用于生成和验证JWT
- body-parser:用于解析请求体中的数据
npm install express jsonwebtoken body-parser
设置密钥
SECRET_KEY:用于签名和验证JWT的密钥。请确保在生产环境中使用更安全的方式存储密钥。
// 密钥(请确保在生产环境中使用更安全的方式存储密钥)
const SECRET_KEY = 'your_secret_key';
中间件
bodyParser.json():解析请求体。
// 中间件:解析请求体
app.use(bodyParser.urlencoded({extended: false}))
authenticateJWT:验证JWT的中间件。如果验证失败,返回403状态码。
// 中间件:验证JWT
const authenticateJWT = (req, res, next) => {const token = req.headers.authorization;if (!token) {return res.sendStatus(403);}jwt.verify(token, SECRET_KEY, (err, user) => {if (err) {return res.sendStatus(403);}console.log(user, 'user')req.user = user;next();});
};
路由
/register:模拟用户注册并生成JWT。
// 路由:注册用户(示例,仅用于生成token)
app.post('/register', (req, res) => {const { username, password } = req.body;// 在实际场景中,您应该验证用户并存储其信息// 这里仅假设用户验证成功if (username && password) {// 通过jwt.sign() 生成JWT字符串,// 三个参数分别是:1-用户信息对象(不要把密码进行加密),2-加密密钥,3-配置对象 expiresIn-配置token有效期const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });res.json({message: 'User registered successfully',token: token});} else {res.status(400).json({ message: 'Invalid credentials' });}
});
/protected:受保护的路由,需要验证JWT才能访问。
// 路由:受保护的资源
app.get('/protected', authenticateJWT, (req, res) => {res.json({message: 'This is a protected route',user: req.user});
});
运行服务器
服务器在3000端口运行,你可以通过http://localhost:3000访问。
app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});
效果


完整代码
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
// 密钥(请确保在生产环境中使用更安全的方式存储密钥)
const SECRET_KEY = 'your_secret_key';
// 中间件:解析请求体
app.use(bodyParser.urlencoded({extended: false}))
// 路由:注册用户(示例,仅用于生成token)
app.post('/register', (req, res) => {const { username, password } = req.body;// 在实际场景中,您应该验证用户并存储其信息// 这里仅假设用户验证成功if (username && password) {// 通过jwt.sign() 生成JWT字符串,// 三个参数分别是:1-用户信息对象(不要把密码进行加密),2-加密密钥,3-配置对象 expiresIn-配置token有效期const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });res.json({message: 'User registered successfully',token: token});} else {res.status(400).json({ message: 'Invalid credentials' });}
});
// 中间件:验证JWT
const authenticateJWT = (req, res, next) => {console.log(req.headers, 'req.headers')const token = req.headers.authorization;if (!token) {return res.sendStatus(403);}console.log(token, 'token')jwt.verify(token, SECRET_KEY, (err, user) => {if (err) {return res.sendStatus(403);}console.log(user, 'user')req.user = user;next();});
};
// 路由:受保护的资源
app.get('/protected', authenticateJWT, (req, res) => {res.json({message: 'This is a protected route',user: req.user});
});
app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});
除了 jwt.verify进行token验证之外,还可以使用 express-jwt 中间件。
在Express应用中,express-jwt(现在通常称为express-jwt-ez,因为它是express-jwt的一个更现代、更轻量级的替代品)是一个中间件,用于验证JWT(JSON Web Tokens)。它会自动从请求中提取JWT,并使用提供的密钥或密钥函数来解密(验证)它。如果JWT有效,中间件会将解码后的负载(payload)附加到请求对象上,以便后续的处理程序(handler)可以使用。
安装express-jwt
npm install express-jwt
配置JWT中间件
// 配置JWT中间件
app.use(jwt({secret: SECRET_KEY,algorithms: ['HS256'] // 指定用于签名JWT的算法(这里使用的是HS256)
}).unless({path: ['/generate-token', /^\/public\//] // 指定哪些路径应该跳过JWT验证(例如,生成token的端点和公共资源的端点)
}));
需要注意的是,在使用此方法进行token校验时,Authorization 的value指前面需要包含"Bearer "字符串。
完整代码
const express = require('express');
const expressjwt = require('express-jwt');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
// 密钥(请确保在生产环境中使用更安全的方式存储密钥)
const SECRET_KEY = 'your_secret_key_here';
// 中间件:解析请求体
app.use(bodyParser.urlencoded({extended: false}))
// 配置JWT中间件
app.use(expressjwt({secret: SECRET_KEY,algorithms: ['HS256'] // 指定用于签名JWT的算法(这里使用的是HS256)
}).unless({path: ['/generate-token', /^\/public\//] // 指定哪些路径应该跳过JWT验证(例如,生成token的端点和公共资源的端点)
}));
// 路由:生成JWT(这个端点不需要JWT验证)
app.post('/generate-token', (req, res) => {const { username } = req.body;if (!username) {return res.status(400).json({ message: 'Username is required' });}// 生成JWT(在实际应用中,你可能还会包含其他信息,如用户ID、角色等)const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });res.json({message: 'Token generated successfully',token: token});
});
// 路由:受保护的资源(这个端点需要JWT验证)
app.get('/protected', (req, res) => {// 如果JWT验证成功,req.auth 将包含解码后的负载(payload)const { username } = req.auth;res.json({message: 'This is a protected route',user: {username: username}});
});
app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});
相关文章:
jwt在express中token的加密解密实现方法
在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后,今天来详细学习一下token是如何生成的,secret密钥的加密解密过程是怎么样的。 安装依赖 express:用于创建服务器jsonwebtoken:用于生成和验证JWTbody-parser࿱…...
结构体、共用体的字节对齐
结构体 结构体嵌套时:先算一下嵌套的结构体大小 嵌套进来的结构体大小为16字节,仍然进行,8字节对齐 typedef struct {char name[20];//20字节//000开始 20字节 019 struct{int day; //000开始 4字节 003char swx; //004开始 1…...
【YOLOv3】源码(train.py)
概述 主要模块分析 参数解析与初始化 功能:解析命令行参数,设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能:初始化日志记录器,配置监控系统项目经理使用监控和记录工具,实时跟踪施工进度和质量…...
帧缓存的分配
帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…...
基于顺序表实现队列循环队列的处理
文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列(校招难度) 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源: 我们的这个队列里面是有9个位置的,我们知道这个队列…...
磁珠选型规范
根据不同的应用场景,磁珠可以分为普通型磁珠,大电流型磁珠和尖峰型磁珠。 (1)普通型磁珠:主要用于电流比较小(小于600mA).无特殊要求的场景,普通型磁珠的直流电阻一般不超过1Ω&…...
linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置
inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…...
3DMAX镂空星花球建模插件FloralStarBall使用方法
3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模,再也不用手动做了,使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成! 3DMAX镂空星花球建模插件FloralStarBall,经典星形球体的美丽变体。星形…...
window 安装 nodejs
方式一:使用 fnm 可能会出现 cmd 找不到 nodejs 和 npm 的情况,并且包也可能不知道哪一个 参考链接 Node.js — Download Node.js 使用 powershell 操作,要不然可能有些执行不了 # 安裝 fnm (快速 Node 管理器) winget install Schniz.fnm# …...
Autoware Universe 安装记录
前提: ubuntu20.04,英伟达显卡。 ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(ROS2)版本,桌面版 ROS2-dev-tools安装 sudo apt install python3-testresources sudo apt update …...
每天40分玩转Django:Django部署概述
一、Django部署概述 在开发阶段,我们通常使用Django内置的轻量级开发服务器runserver。但在生产环境中,为了应对大量并发请求,需要使用高性能的WSGI服务器,如Gunicorn、uWSGI等。同时还要配置Nginx等Web服务器作为反向代理,实现负载均衡、静态文件处理等。下面是Django部署的整…...
使用VS Code开发ThinkPHP项目
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…...
基于深度可分离卷积的MNIST手势识别
基于深度可分离膨胀卷积的MNIST手写体识别 Github链接 项目背景: MNIST手写体数据集是深度学习领域中一个经典的入门数据集,包含了从0到9的手写数字图像,用于评估不同模型在图像分类任务上的性能。在本项目中,我们通过设计一种基…...
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
安装 1.拉取项目 项目地址: chatgpt-on-wechat 2.安装依赖 pip3 install -r requirements.txt pip3 install -r requirements-optional.txt3、获取API信息 当前免费的有百度的文心一言,讯飞的个人认证提供500万token的额度。 控制台-讯飞开放平台 添加链接描述…...
Word批量更改题注
文章目录 批量更改批量去除空格 在写文章的时候,往往对图片题注有着统一的编码要求,例如以【图 1- xx】。一般会点击【引用】->【插入题注】来插入题注,并且在引用的时候,点击【引用】->【交叉引用】,并且在交叉…...
Springboot配置嵌入式服务器
一.如何定制和修改Servlet容器的相关配置 修改和server有关的配置(ServerProperties); server.port8081 server.context‐path/tx server.tomcat.uri‐encodingUTF‐8 在yml配置文件的写法: server:port: 8081servlet:context-pa…...
正交三角函数全面阐述
目录 1. 正交性定义 2. 正交三角函数 常见的正交三角函数 3. 正交三角函数的特性 4. 正交三角函数在傅里叶分析中的应用 5. 正交三角函数的应用领域 6. 总结 正交三角函数是指在特定条件下,三角函数之间的内积为零。更具体地说,在数学分析、信号处…...
《Vue3 四》Vue 的组件化
组件化:将一个页面拆分成一个个小的功能模块,每个功能模块完成自己部分的独立的功能。任何应用都可以被抽象成一棵组件树。 Vue 中的根组件: Vue.createApp() 中传入对象的本质上就是一个组件,称之为根组件(APP 组件…...
linux中,mysql数据库分片(分库分表)
1.mysql分库分表:解决单个mysql存储上限问题1.实现方法:存储层面:利用分布式存储解决方案分库分表:拆分库和表到其它服务器2.常用设计思路:垂直分库(库里面的表分开)水平分表(表里面的数据分开)分库:数据库分为多个,每个数据库里面都有表,数据均匀存储分库分表:在分的每库里面,…...
springboot503基于Sringboot+Vue个人驾校预约管理系统(论文+源码)_kaic
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装个人驾校预约管理系统软件来发挥其高效地信息处理的作用&am…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
