node.js express JWT token生成与校验

目录

JWT

header(标头)

payload(有效负载)

signature(签名)

访问令牌(token)

express jwt生成、验证

生成jwt

验证jwt


JWT

JWT 是轻量级的数据交换格式,相对于传统的 Session 机制,JWT 不需要在服务器端存储会话信息,而是将所有必要的信息包含在令牌本身中。

生成验证流程

用户账号密码注册或登录,服务端用HMACSHA256根据secret和base64Url编码后的headerpayload进行加密生成signature,然后将base64Url编码后的headerpayload以及signature通过“.”相连接,最终形式xxxx.yyyy.zzzz(token),之后用户每次请求资源的时候将访问令牌token放在请求头中,服务端在验证其是否有效之后,返回相对应的资源信息。

header(标头)

生成token的头信息,通常由两部分组成,包含令牌类型alg和所使用的签名算法typ

{
    "alg":"HS256",
    "typ":"JWT"
}

payload(有效负载)

通常包括生成jwt的非隐私信息,用户的唯一标识符id,发行时间iat,到期时间exp

{
  "id": "655c78ccd9107661e41abd9f",
  "iat": 1702260106,
  "exp": 1710036106
}

signature(签名)

HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一种加密算法,是SHA-256散列函数与一个密钥结合的身份验证方法。HMAC的安全性基于散列函数(SHA-256),而且可以通过密钥的添加来增加信任度。此算法经常用于网络领域中,例如 HTTPS、SSL、SSH 等加密通讯领域。

生成signature:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload), secret
)

访问令牌(token)

base64UrlEncode(header) + '.' + base64UrlEncode(payload) + '.' + signature

举例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY1NWM3OGNjZDkxMDc2NjFlNDFhYmQ5ZiIsImlhdCI6MTcwMjI2MDEwNiwiZXhwIjoxNzEwMDM2MTA2fQ.ca-J91WaThntP3IhMBQNps9MVqts8oi_f62KcV2r4D8

express jwt生成、验证

1、安装jsonwebtoken依赖,npm install jsonwebtoken --save

2、在代码controller层引入依赖,在登录、注册的时候生成token

//环境变量,通过安装dotenv依赖,在express入口文件中加载,
这么做的目的是不让密钥等敏感信息硬编码在代码中JWT_SECRET=this-is-my-secret-password
JWT_EXPIRES_IN=90d

生成jwt

// authController.js 用户的登录、注册、密码修改、token生成、权限校验、凭证认证等
const jwt = require('jsonwebtoken');const signToken = id => {return jwt.sign({ id }, process.env.JWT_SECRET, {expiresIn: process.env.JWT_EXPIRES_IN});
};

验证jwt

promisify(jwt.verify)(token, process.env.JWT_SECRET);

const { promisify } = require('util'); // protect中间件, 用于验证用户
exports.protect = catchAsync(async (req, res, next) => {let token;if (req.headers.authorization &&req.headers.authorization.startsWith('Bearer')) {token = req.headers.authorization.split(' ')[1];}if (!token) {return next(new AppError('您还还没有登录或注册', 401));}// 2) 验证 tokenconst decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);// 验证jwt是否有效,decode信息是payload,其中包含用户生成jwt的id、iat、exp// 通过这个唯一id可以查询用户信息,如果promisify是rejected则进行错误处理逻辑
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5分钟搞懂Kubernetes:轻松理解所有组件

Kubernetes 首先,我想强调的是,在学习任何一项知识时,官方文档都是最重要的资源:Kubernetes 文档 | Kubernetes 官方文档提供了详尽、准确的信息,帮助我们深入了解和掌握这个技术。因此,如果你真的对Kubern…

Jenkins 添加节点报错

报错日志 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (cl…

Python接口测试 requests.post方法中data与json参数区别

引言 requests.post主要参数是data与json,这两者使用是有区别的,下面我详情的介绍一下使用方法。 Requests参数 1. 先可以看一下requests的源码: def post(url, dataNone, jsonNone, **kwargs):r"""Sends a POST request.…

c# 字段和属性(get、set、init)

目录 基本概念: 个人理解: 访问器的默认写法: set与init无法共存: init: 必须在类的实例化时给字段赋值的情况(require属性): 基本概念: “字段”就是类内成员变量,一般为了隐藏数据&…

抗EMC干扰高精度隔离放大器ISO EC 系列

SunYuan ISO EC系列模拟信号隔离放大器是一种有较强抗EMC干扰特性的电容耦合隔离混合集成电路。该放大器采用了全新的调制-解调电容耦合隔离技术,模块中信号以数字信号的方式通过电容隔离层进行传输,通过数字调制和电容耦合隔离方式保持信号的完整性&…

【深度学习】注意力机制(三)

本文介绍一些注意力机制的实现,包括EMHSA/SA/SGE/AFT/Outlook Attention。 【深度学习】注意力机制(一) 【深度学习】注意力机制(二) 【深度学习】注意力机制(四) 【深度学习】注意力机制&a…

Google为什么它还没有开发出ChatGPT,如何反超,小公司创新的产品如何反超巨头 行业巨头如何防止被小公司或创新型公司的产品超越

Google虽然收购了Geoffrey Hinton及其在多伦多大学的两名研究生组成的公司DNNresearch Inc.,但为什么它还没有开发出类似ChatGPT的产品,可能有以下几个原因: 不同的研发方向:Google在人工智能领域的研发方向可能与OpenAI&#xff…

大创项目推荐 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的数学公式识别算法实现 该项目较为新颖,适合作为竞赛课题方向,学…

基于Spring Boot+Vue.js的停车场收费管理系统 需求分析

1 用户(收费员) 1.1 主页 1.1.1 摄像头实时捕捉画面,如果有车牌号则识别出车牌(如:京A11111),通过车牌底色识别出小型车(蓝色)、大型车(黄色)。…

《对话品牌》——科技与时尚的融合

本期节目《对话品牌》栏目组邀请到了江西先禾服饰有限公司董事长吁火兰女士参加栏目录制,分享其企业故事,树立品牌形象,提升品牌价值! 节目嘉宾:吁火兰 节目主持人:杨楠 节目播出平台:中央新…

【已解决】java 无法将类 XX类中的构造器 X应用到给定类型

原因: 实际参数列表和形式参数列表长度不同 解决方法: 给类添加AllArgsConstructor注解即可。

Xcode编写基于C++的动态连接库(dylib)且用node-ffi-napi测试

创建一个dylib工程示例 在 Xcode 中创建一个动态链接库(.dylib 文件)的步骤如下: 打开 Xcode: 打开 Xcode 应用程序。 创建新的工程: 选择 "Create a new Xcode project",或者使用菜单 File &g…

MagicAnimate:Temporally consistent human image animation using diffusion model

1.Introduction 本文研究了任务形象动画人物,旨在根据特定的运动序列生成一个具有特定参考身份的视频。现有的人物图像动画的数据驱动方法可以基于所使用的生成主干模型分为两类,1.基于GAN,通常使用变形函数将参考图变形为目标姿态&#xff0…

JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析 这里使用的 JDK 版本为 JDK8! 在分析 GC 日志时,可以同时采用多种工具(Arthas、gceasy、JVM 连接 Graphana 监控)进行分析,避免某种工具分析不准确 gceasy 每个月只可以免费…

广州旅游攻略(略说一二)

广州是中国南方的一个重要城市,也是广东省的省会,拥有着悠久的历史和丰富的文化遗产。作为中国最繁华的城市之一,广州吸引了大量的游客前来探索其独特的魅力。今天我将为大家介绍一份广州旅游攻略,希望能帮助各位游客更好地了解这…

实验六 指针程序设计 要求设三个指针变量p1,p2,p3, 使p1指向三个数中最大者,p2指向次大者,p3指向最小者

1. 从键盘输入任意三个数,要求设三个指针变量p1,p2,p3, 使p1指向三个数中最大者,p2指向次大者,p3指向最小者, 然后从大到小输出三个数。 运行时分别输入3,7,5和6,-4,2&a…

【C++】策略模式

目录 一、简介1. 含义2. 特点 二、实现1. 策略接口(Strategy Interface)2. 具体策略类(Concrete Strategies)3. 上下文类(Context)4. 使用策略模式 三、总结如果这篇文章对你有所帮助,渴望获得你…

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包,下载的源码,需要编译安装 unzip解压 cd mjpg-streamer/mjp…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的相关概念

AntDB-M在架构上分为两层,服务层和存储引擎层。元数据的并发管理集中在服务层,数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性,引入了元数据锁(MDL)。 AntDB-M提供了丰富的元数据锁功能&#xff…

java写个爬虫抓取汽车之家车型配置参数

前几天有个搞工程的表弟找我,问我什么车好,可以经常跑工地的,看上去又有面子。于是我挥动发财的小手,写一个爬虫程序,筛选并整理了一些数据,并附上下载的图片提供参考,看中了果断第二天提车到手…