在 Express 中使用 JWT

1. 安装 JWT 相关的包

        运行下面两个命令,安装如下两个 JWT 相关的包

npm i jsonwebtoken express-jwt

        jsonwebtoken 用于生成 JWT 字符串

        express-jwt 用于将 JWT 字符串解析还原成 JSON 对象

2. 导入 JWT 相关的包

// 导入
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')

3. 定义 secret 密钥

        为了保证 JWT 字符串的安全性,防止JWT字符串在网络传输过程中被别人破解,我们需要专门定义一个用于加密解密的 secret 密钥:

        ①   当生成JWT字符串时,需要使用 secret 密钥对用户的信息进行加密,最终得到加密好的JWT字符串

        ②   当把JWT字符串解析还原成JSON对象时,需要使用 secret 密钥进行解密

// 定义 secret 密钥,建议将密钥命名为 secretKey
// secret 密钥的本质:就是一个字符串
const secretKey = 'love sy ^_^'

4. 在登录成功后生成 JWT 字符串

        调用 jsonwebtoken 包提供的 sign() 方法,将用户的信息加密成jwt字符串,响应给客户端

// 登录接口
app.post('/api/login', function(req, res) {const userinfo = req.body// 登录失败// ......省略// 登录成功// 登录成功后,调用 jwt.sign() 方法生成 jwt字符串,并通过token发送给客户端// 参数1: 用户的信息对象// 参数2: 加密的密钥// 参数3: 配置对象,可以配置当前 token 的有效期const tokenStr = jwt.sign({username: userinfo.username}, secretKey, { expiresIn: '30s'})res.send({status: 200, message: '登录成功!',token: tokenStr,  // 要发送给客户端的 token 字符串})
})

5. 将 JWT 字符串还原成 JSON 对象

        客户端每次访问有权限的接口时,都需要主动通过请求头中的 Authorization 字段,将 Token 字符串发送到服务器进行身份验证

        服务器可以通过 express-jwt 中间件,自动将客户端发送的 Token 解析还原成 JSON 对象

// 注册将 JWT 字符串还原成 JSON 对象的中间件
// expressJWT({ secret: secretKey }) 解析 Token 的中间件
// .unless({ path: [/^\/api\//] }) 用来指定哪些接口不需要访问权限
app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] }))

6. 使用 req.user 获取用户信息

        当 express.jwt 这个中间件配置成功后,即可在有权限的接口中使用 req.user 对象,来访问从 JWT 字符串中解析出来的用户信息

        最新版 是挂载到 req.auth

// 这是一个有权限的 API 接口
app.get('/admin/getinfo', (req, res) => {// 使用 req.user 获取用户信息,并发送给客户端res.send({status: 200, message: '获取用户信息成功!',data: req.user, // 要发送给客户端的用户信息})
})

7. 捕获解析 JWT 失败后产生的错误

        使用 express-jwt 解析 Token 字符串时,如果客户端发送过来的 Token 字符串过期或不合法,会产生一个解析失败的错误,影响项目的正常运行,我们可以通过 Express 的错误中间件,捕获这个错误并进行相关的处理

// 捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {// 错误由 token 解析失败导致if(err.name === 'UnauthorizedError') {return res.send({status: 401,message: '无效的token'})}res.send({status: 500,message: '未知错误'})
})

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

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

相关文章

Elasticsearch(15) multi_match的使用

elasticsearch version: 7.10.1 multi_match是Elasticsearch中的一种查询类型,允许在一个或多个字段上执行全文本搜索,并合并各个字段的结果得分。这种查询有助于实现跨多个字段的统一搜索体验。 语法 {"query": {"multi_m…

深入剖析Hadoop面试题(75个问题,1.5万字)

在大数据时代,Hadoop作为分布式存储与计算的基石,已成为众多企业构建数据处理平台的首选。对于追求大数据岗位的专业人士来说,熟练掌握Hadoop的原理和应用是必备技能。本文将深入探讨多个Hadoop面试题,并提供详尽的参考答案,助你在面试中脱颖而出。 介绍下Hadoop Hadoop是…

vue+Echarts实现多设备状态甘特图

目录 1.效果图 2.代码 3.注意事项 Apache ECharts ECharts官网,可在“快速上手”处查看详细安装方法 1.效果图 可鼠标滚轮图表和拉动下方蓝色的条条调节时间细节哦 (注:最后一个设备没有数据,所以不显示任何矩形)…

【】(综合练习)博客系统

在之前的学些中,我们掌握了Spring框架和MyBatis的基本使用,接下来 我们就要结合之前我们所学的知识,做出一个项目出来 1.前期准备 当我们接触到一个项目时,我们需要对其作出准备,那么正规的准备是怎么样的呢 1.了解需求…

探讨大数据、云计算与物联网的融合与发展

随着信息技术的飞速发展,大数据、云计算和物联网已经成为了科技领域的三大热点。它们各自具有独特的特点和应用领域,但同时也存在着紧密的联系。本文将详细阐述大数据的四个基本特征,大数据产业的多个层面,以及大数据、云计算和物…

深入探索C语言动态内存分配:释放你的程序潜力

🌈大家好!我是Kevin,蠢蠢大一幼崽,很高兴你们可以来阅读我的博客! 🌟我热衷于分享🖊学习经验,🏫多彩生活,精彩足球赛事⚽ 🌟感谢大家的支持&#…

[激光原理与应用-80]:PLC通信协议之-OMRON欧姆龙FINS TCP通信协议详细解析

目录 一、OMRON欧姆龙 PLC简介 1.1 OMRON欧姆龙 PLC 1.2 OMRON欧姆龙 PLC通信协议简介 1.3 通信架构 二、欧姆龙FINS协议简介 2.1 简介 2.2 协议分层 2.3 OMRON(欧姆龙)FINS协议的本质 2.4 OMRON(欧姆龙)FINS&#xff08…

请说明Vue父组件向子组件传值的方法

在Vue中&#xff0c;父组件向子组件传值主要通过props来实现。props是Vue组件之间传递数据的一种基本方式&#xff0c;允许父组件向子组件传递数据。 下面是一个简单的示例&#xff0c;说明如何在Vue中通过props从父组件向子组件传递数据&#xff1a; <template> <…

LeetCode热题Hot100-两数相加

一刷一刷 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不…

Python爬虫之正则表达式与httpx的使用与案例

三、正则表达式 1、实例 模式描述\w匹配字母、数字以及下划线\W匹配不是字母、数字以及下划线\s匹配任意空白字符&#xff0c;等价于[\t\n\r\f]\S匹配任意非空字符\d匹配任意数字&#xff0c;等价于[0-9]\D匹配任意非数字的字符\A匹配字符串开头\Z匹配字符串结尾。如果存在换…

C++中的流

前言 在 C 中&#xff0c;流&#xff08;stream&#xff09;是一种数据传输的抽象概念&#xff0c;用于在程序中对输入和输出进行操作。流分为输入流和输出流&#xff0c;允许数据在程序和外部设备&#xff08;如键盘、屏幕、文件&#xff09;之间进行传输。输入流用于从外部获…

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高&#xff0c;性能要好通常用来做自动驾驶的AI推理&#xff0c;具体外观如下图 1.刷机软件sdkmanager&#xff1a;下载链接 NVIDIA账号需要注册&#xff0c;正常一步一步往下走就行。在ubuntu18以上的系统安…

Verilog刷题笔记45

题目&#xff1a;Given the finite state machine circuit as shown, assume that the D flip-flops are initially reset to zero before the machine begins. Build this circuit. 解题&#xff1a; module top_module (input clk,input x,output z ); wire [2:0]size;dtou…

第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》

第一篇&#xff1a;概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 ​​​​​​​​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…

WSL+Ununtu+Docker踩坑指南

Ubuntu安装docker后启动不了&#xff0c;解决问题如下&#xff1a; 1.在wsl中安装Ubuntu&#xff0c;在Ubuntu中安装docker&#xff0c;此时用的Ubuntu的版本为Ubuntu-22.04发行版&#xff0c;安装docker教程如下。 https://docs.docker.com/engine/install/ubuntu/2. 完成安…

第十五届蓝桥杯模拟赛 第三期 (C++)

第二次做蓝桥模拟赛的博客记录&#xff0c;可能有很多不足的地方&#xff0c;如果大佬有更好的思路或者本文中出现错误&#xff0c;欢迎分享思路或者提出意见 题目A 请问 2023 有多少个约数&#xff1f;即有多少个正整数&#xff0c;使得 2023 是这个正整数的整数倍。 答案&…

Linux telnet命令教程:远程控制工具(附实例详解和注意事项)

Linux telnet命令介绍 telnet&#xff08;Teletype Network&#xff09;是一种网络协议&#xff0c;用于在远程主机和本地计算机之间建立文本式连接。它最初于1969年开发&#xff0c;是Internet的早期协议之一。telnet命令使用TCP/IP网络通过端口23建立连接&#xff0c;提供了…

MySQL B树 和B+数据的区别

MySQL B树 和B数据的区别 树分类&#xff1a;二叉树完全二叉树满二叉树堆红黑树 B树B树 首先我们搞清楚数据结构中的 树这个概念 树 分类&#xff1a; 二叉树 限定每个节点的子节点最多只有2个子节点&#xff0c;且有左右之分。完全二叉树 满二叉树 堆 红黑树 B树 B树 …

上位机图像处理和嵌入式模块部署(qmacvisual之ROI设定)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 ROI&#xff0c;全称是region of interest&#xff0c;也就是感兴趣区域。这里面一般分成两种情况&#xff0c;一种是所有的算法都依赖于这个ROI&a…

谷粒商城——缓存的读写一致性

1. 对于实时性要求很强的数据&#xff0c;如果修改完数据库&#xff0c;需要保证缓存中的数据也更新为相应的最新值。此时需要在更新数据库之前加上写锁&#xff0c;在更新/删除完缓存后才释放写锁。 伪代码如下&#xff1a; lock.writeLock().lock(); updateDB(); updateCac…