Nodejs入门 token校验

Nodejs入门token校验之jsonwebtoken的使用


前言

 token校验作为项目里的必要项,其重要性不言而喻,今天介绍一个在Node.js中备受推崇的神奇工具——jsonwebtoken


一、token是什么jsonwebtoken是什么?

       在互联网世界中,Token是一种用于表示身份验证和授权的令牌。以jsonwebtoken为例,它生成的JWT就是一种Token。Token通常由服务器颁发给用户,并在用户进行身份验证后用于标识用户身份。当用户希望访问需要授权的资源时,Token就成为了一种凭证,用于证明用户的身份和权限。jsonwebtoken是一个用于在Node.js应用程序中创建和验证JSON Web Tokens(JWT)的库。JWT是一种轻量级的身份验证和授权机制,它使用JSON对象作为安全令牌,使得在客户端和服务器之间传递认证信息变得更加安全和可靠。

 

二、使用步骤

1.安装jsonwebtoken

安装jsonwebtoken非常简单。打开你node项目进入终端,输入以下命令:

npm install jsonwebtoken

2.生成秘钥

在使用jsonwebtoken之前,我们首先需要生成一个秘钥(secretKey),用于对JWT进行加密签名。秘钥的生成规则是非常重要的,以下是一个常用的生成规则示例:

const crypto = require('crypto');const generateSecretKey = () => {return crypto.randomBytes(32).toString('hex');
};const secretKey = generateSecretKey();
console.log('Generated secret key: ', secretKey);

      上述代码中,我们使用Node.js的crypto模块生成了一个具有足够强度的随机秘钥。这里我们生成了一个32字节的秘钥,并将其输出到控制台。请注意,生成的秘钥应妥善保存,避免泄露。

3.如何使用jsonwebtoken?

  首先,你需要导入jsonwebtoken库:

const jwt = require('jsonwebtoken');

4.生成一个JWT

接下来,让我们来创建一个JWT。使用jsonwebtoken的sign方法可以帮助我们完成这个任务:

const payload = { user: 'John Doe' };
const secretKey = 'supersecretkey';const token = jwt.sign(payload, secretKey);
console.log(token);

上面的代码中,我们定义了一个负载(payload)对象,它包含了我们想要在JWT中传递的信息。然后,我们提供了之前生成的秘钥(secretKey),用于对JWT进行加密签名。最后,我们使用jwt.sign方法生成了一个JWT,并将其打印输出。


5.验证一个JWT

在验证阶段,jsonwebtoken会验证JWT的签名是否有效,并解析出负载中的数据。请注意,为了验证JWT的签名,我们需要使用相同的秘钥。

function verifyToken(req, res, next) {const token = req.headers.token; // 从请求头中获取 tokenif (!token) {res.status(401).json({ code: 401,success: false, msg: "未登录或登录过期!" });return;}jwt.verify(token, 'token', (err, decoded) => {if (err) {res.status(401).json({ code: 401,success: false, msg: "登录过期,请重新登录!" });return;}req.userId = decoded.userId; // 将解码后的用户信息存储在请求对象中,以便后续接口使用next();});
}

在上述代码中,我们提供了一个JWT和之前生成的秘钥,然后使用jwt.verify方法进行验证。如果验证成功,我们可以在回调函数中访问解码后的负载数据。

6.结合接口请求

jsonwebtoken也可以与接口请求结合使用,以实现身份验证和授权。


axios.get("https://api.example.com/info", verifyToken, (req, res, next) => {const userId = req.userId;pool.query("SELECT * FROM user WHERE id = ?", [userId], (err, result) => {if (err) {next(err);return;}if (result.length > 0) {const user = result[0];res.json({ code: 200, success: true, msg: "查询用户信息成功", user });} else {res.json({ code: 500, success: false, msg: "用户不存在" });}});

在上述代码中,我们使用axios库发送了一个GET请求到'https://api.example.com/data'。通过在请求头中添加`Authorization`字段,并将JWT作为Bearer令牌附加在请求头上,我们可以将身份验证信息传递给API。如果身份验证成功,API将返回相应的数据。

总结

       在本篇博客中,我们详细介绍了jsonwebtoken在Node.js中的使用。jsonwebtoken是一个强大而受欢迎的库,用于创建和验证JSON Web Tokens(JWT)。JWT是一种轻量级的身份验证和授权机制,通过使用JSON对象作为安全令牌,提高了在客户端和服务器之间传递认证信息的安全性和可靠性。

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

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

相关文章

用Go编写ChatGPT插件

ChatGPT插件平台有望成为影响深远的"下一件大事",因此对于开发者来说,有必要对ChatGPT插件的开发有一定的了解。原文: Writing a ChatGPT Plugin With Go[1] 我工作的附带福利之一是偶尔可以接触试用一些很酷的新技术,最近的一项技…

day-01 Docker

一、docker简介 Docker 是一种开源的容器化平台,它可以帮助开发人员将应用程序及其依赖项打包成一个独立的、可移植的容器,而无需担心环境差异和依赖问题。通过使用 Docker,您可以更轻松地创建、分发和运行应用程序,无论是在开发、…

自然语言处理学习笔记(七)————字典树效率改进

目录 1. 首字散列其余二分的字典树 2.双数组字典树 3.AC自动机(多模式匹配) (1)goto表 (2)output表 (3)fail表 4.基于双数组字典树的AC自动机 字典树的数据结构在以上的切分算法中已经很快了&#x…

轴向磁通电驱动解析

轴向磁通电机的技术创新和量产应用,或将有效解决电动汽车领域目前所面临的一些突出难题,比如轻量化、扭矩密度和人们最为关心的续航里程等。在奔驰汽车刚刚发布的Vision One Eleven概念车,以及此前已经面世的法拉利SF90 Stradale、296GTB和迈…

【函数栈帧解析:代码的迷人堆积和无限嵌套】

本章重点 一、何为函数栈帧 二、函数栈帧特性 - 同栈 - 后进先出 三、认识内存空间布局图 四、认识相关寄存器 五、认识相关汇编命令 六、测试代码: 七、函数栈帧全过程 要解决的问题​​​​​​​ 局部变量是怎么创建的?为什么局部变量的值是随机值&am…

韶音骨传导耳机好不好,韶音骨传导耳机值得入手吗

韶音耳机的质量还是很不错的,其实力相比于百元价位的耳机而言领先了不少,具备多种功能,佩戴起来也是有着舒适性。它自主研发了骨传导音频技术,不过在今年开始,似乎已经将方向开始往运动偏移。 而在韶音的骨传导耳机中&…

git clone 报SSL证书问题

git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码

设计模式备忘录+命令模式实现Word撤销恢复操作

文章目录 前言思路代码实现uml类图总结 前言 最近学习设计模式行为型的模式,学到了备忘录模式提到这个模式可以记录一个对象的状态属性值,用于下次复用,于是便想到了我们在Windows系统上使用的撤销操作,于是便想着使用这个模式进…

day28 异常

to{}catch{} try{}catch{}的流传输 try {fis new FileInputStream("file-APP\\fos.txt");fos new FileOutputStream("fos.txt");int a ;while ((a fis.read())! -1){fos.write(a);}System.out.println(a); } catch (IOException e) {e.printStackTrace()…

24.排序,插入排序,交换排序

目录 一. 插入排序 (1)直接插入排序 (2)折半插入排序 (3)希尔排序 二. 交换排序 (1)冒泡排序 (2)快速排序 排序:将一组杂乱无章的数据按一…

高可用集群介绍

一、高可用集群概念 高可用集群( High Availability Cluster, HA 集群),其中高可用的含义是最大限度地可以使用。从集群 的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断地提供服务。当应用程序出现故障或…

【笔记】PyCharm快捷键大全

PyCharm是一种Python集成开发环境(IDE),由JetBrains公司开发。它被认为是Python开发中最强大、最流行的IDE之一。PyCharm具有完整的Python开发工具链,包括先进的代码编辑器、代码分析工具、集成的调试器、版本控制系统集成、自动化…

前端将UTC时间格式转化为本地时间格式-uniapp写法

UTC时间格式是什么 首先我们先简单的了解一下:UTC时间(协调世界时,Coordinated Universal Time)使用24小时制,以小时、分钟、秒和毫秒来表示时间 HH:mm:ss.SSSHH 表示小时,取值范围为00到23。mm 表示分钟…

Python股票交易---均值回归

免责声明:本文提供的信息仅用于教育目的,不应被视为专业投资建议。在做出投资决策时进行自己的研究并谨慎行事非常重要。投资涉及风险,您做出的任何投资决定完全由您自己负责。 在本文中,您将了解什么是均值回归交易算法&#xff…

ChatGPT癌症治疗“困难重重”,真假混讲难辨真假,准确有待提高

近年来,人工智能在医疗领域的应用逐渐增多,其中自然语言处理模型如ChatGPT在提供医疗建议和信息方面引起了广泛关注。然而,最新的研究表明,尽管ChatGPT在许多领域取得了成功,但它在癌症治疗方案上的准确性仍有待提高。…

leetcode 392. 判断子序列

2023.8.25 本题要判断子序列,可以使用动态规划来做,定义一个二维dp数组。 接下来就是常规的动态规划求解子序列的过程。 给出两种定义dp数组的方法。 二维bool型dp数组: class Solution { public:bool isSubsequence(string s, string t) …

在云原生环境中构建可扩展的大数据平台:方法和策略

文章目录 1. **选择适当的云提供商:**2. **采用容器化和微服务架构:**3. **分层架构设计:**4. **弹性计算资源:**5. **使用分布式计算框架:**6. **数据分区和分片:**7. **使用列式存储:**8. **缓…

qt day 1

this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…

【计算机视觉|生成对抗】用于高保真自然图像合成的大规模GAN训练用于高保真自然图像合成的大规模GAN训练(BigGAN)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 标题:Large Scale GAN Training for High Fidelity Natural Image Synthesis 链接:[1809.11096] Large Scale GAN Training for High Fidelity Natural Image Synthesis (arxiv.org…

Rabbitmq消息积压问题如何解决以及如何进行限流

一、增加处理能力 优化系统架构、增加服务器资源、采用负载均衡等手段,以提高系统的处理能力和并发处理能力。通过增加服务器数量或者优化代码,确保系统能够及时处理所有的消息。 二、异步处理 将消息的处理过程设计为异步执行,即接收到消息…