node.js express JWT token生成与校验

news2024/12/23 15:05:07

目录

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) 验证 token
  const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
  
  // 验证jwt是否有效,decode信息是payload,其中包含用户生成jwt的id、iat、exp
  // 通过这个唯一id可以查询用户信息,如果promisify是rejected则进行错误处理逻辑
});

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

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

相关文章

微服务-理论 分布式事务

一、分布式事务理论模型 分布式事务问题也叫分布式数据一致性问题,简单来说就是如何在分布式场景中保证多个节点数据的一致性。分布式事务产生的核心原因在于存储资源的分布性,比如多个数据库,或者MySQL和Redis两种不同存储设备的数据一致性…

R语言,table()函数实现统计每个元素出现的频数+并将最终统计频数结果转换成dataframe数据框形式

在 R中,要统计dataframe数据框中每个元素出现的频数,可以使用table()函数。以下是一个示例: 目录 一、创建数据 二、统计第一列每个元素出现的频数 三、统计第二列每个元素出现的频数 四、将频数结果转换为数据框,并改列名 一…

【OPNEGIS】Geoserver原地升级jetty,解决Apache HTTP/2拒绝服务漏洞 (CVE-2023-44487)

Geoserver是我们常用的地图服务器,在开源系统中的应用比较广泛。在实际环境中,我们可能会选用官方的二进制安装包进行部署,这样只要服务器上有java环境就可以运行,方便在现场进行部署。 1.问题来源 这次由于甲方一月一次的漏洞扫…

开源框架Apache NiFi调研

开源框架Apache NiFi调研 NiFi背景介绍一、什么是NiFi1.1 Apache NiFi特点:流管理、易用性、安全性、可扩展的体系结构和灵活的伸缩模型。1.2 Apache NiFi特性1.2 Apache NiFi核心概念1.3架构 二、NiFi的诞生,要致力于解决的问题有哪些?三、为…

day01、什么是数据库系统?

数据库系统介绍 1.实例化与抽象化数据库系统2.从用户角度看数据库管理系统的功能2.1 数据库定义功能2.2 数据库操纵2.3 数据库控制2.4 数据库维护功能2.5 数据库语言与高级语言 3.从系统:数据库管理系统应具有什么功能 来源于战德臣的B站网课 1.实例化与抽象化数据库…

React Native android环境搭建,使用夜神模拟器进行开发(适用于0.73+版本)

前言 本文基于:“react-native” : “^0.73.0” 1.安装 Node Node.js,下载时选择 > 18 版本 2.下载并安装 JDK Java SE Development Kit (JDK),下载时选择 17 版本 安装 验证是否安装成功 打开命令提示符输入 javac -version 回车 3.…

【打印机如何设置只打印黑色】

目录 1. Window X 打开,选择“设置” 2. 选择“打印机和扫描仪” 3. 选择对应的“打印机” 4. 选择“打印首选项” 5. 选择“页设置”,并选择“打印选项” 6. 用于打印的墨水,改为“仅黑色” 7. 点击“确定”,关闭即可 1. Wi…

智慧储能数字孪生:能源未来的智慧引擎

随着社会对清洁能源的需求不断增加,智能储能技术成为能源转型的关键驱动力。在这一领域中,数字孪生技术的应用为智慧储能带来了全新的可能性。数字孪生是指数字化、实时、可视化的模拟系统,通过复制现实世界中的对象或过程,为智能…

基于查表法的水流量算法设计与实现

写在前面 本文分享的是一种基于查表法的水流量的算法方案设计与实现,算法简单易懂,主要面向初学者,有两个目的:一是给初学者一些算法设计的思路引导;二是引导初学者学习怎样用C语言编程实现。 一、设计需求 基于“19…

nodejs微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

网络安全——SSH密码攻击实验

一、实验目的要求: 二、实验设备与环境: 三、实验原理: 四、实验步骤:​ 五、实验现象、结果记录及整理: 六、分析讨论与思考题解答: 一、实验目的要求: 1、了解SSH密码攻击、FTP密码攻击…

【小白专用】MySQL查询数据库所有表名及表结构其注释

一、先了解下INFORMATION_SCHEMA 1、在MySQL中,把INFORMATION_SCHEMA看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INF…

YOLOv8改进 | 2023主干篇 | EfficientViT替换Backbone(高效的视觉变换网络)

一、本文介绍 本文给大家带来的改进机制是EfficientViT(高效的视觉变换网络),EfficientViT的核心是一种轻量级的多尺度线性注意力模块,能够在只使用硬件高效操作的情况下实现全局感受野和多尺度学习。本文带来是2023年的最新版本…

无线且列窄图片如何转excel?

写此文原因:图片要转excel,这放以前,是不能实现的功能,但随着人工智能的蓬勃发展,人们已克服了这一难题,但是,我们知道,要将图片识别成excel,识别程序首先要先识别图片中…

Django讲课笔记02:Django环境搭建

文章目录 一、学习目标二、相关概念(一)Python(二)Django 三、环境搭建(一)安装Python1. 从官方网站下载最新版本的Python2. 运行安装程序并按照安装向导进行操作3. 勾选添加到路径复选框4. 完成安装过程5.…

分布式之raft一致性算法

1.CAP定理 在一个分布式系统中,CAP三者不可兼得,最多只有两者可以满足,正所谓鱼和熊掌不可兼得 一致性 Consistency:所有的节点在同一时间的数据一致可用性 Availability:服务在正常响应时间内可用分区容错性 Partit…

〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

UnoCSS 原子化开发初体验

UnoCSS 是一个即时的原子化 CSS 引擎,旨在灵活和可扩展。核心是不拘一格的,所有的 CSS 工具类都是通过预设提供的。再也不用为了取一个 classname 类名而烦恼了。 一、UnoCSS 特点 完全可定制:无核心工具,所有功能都通过预设提供…

DevEco Studio IDE 创建项目时候配置环境

DevEco Studio IDE 创建项目时候配置环境 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、在配置向导的时候意外关闭配置界面该如何二次配置IDE环境。 打开IDE的界面是这样的。 点击Create Project进行环境配置。 点击OK后出现如…

(企业 / 公司项目) 企业项目如何使用jwt?

按照企业的项目然后写的小demo, 自己搞一个登录接口然后调用jwtUtil工具类 后端实现 创建一个通用模块common来实现jwt生成token 登录注册的基本实现逻辑思路 面试| ProcessOn免费在线作图,在线流程图,在线思维导图 注释挺详细的jwtUtil工具类, 封装的…