Nodejs入门 token校验

news2024/11/15 11:00:19

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; // 从请求头中获取 token
  if (!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.coloradmin.cn/o/958442.html

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

相关文章

路由技术介绍

路由技术介绍 一、路由概述1.1、为什么需要路由1.2、路由的定义1.3、直接路由数据通信分析1.4、间接路由数据通信分析1.5、认识路由设备1.6、路由的下一跳1.7、路由表的构成与维护1.8、路由表的构成1.9、路由表的度量值1.10、路由表的内容1.11、管理距离1.12、路由加表原则1.13…

ESP32在线仿真器

1. Wokwi是一个电子在线仿真平台,支持的芯片有ESP32,STM32,树莓派,Arduino 网址: https://wokwi.com ; 而且支持在vscode内置插件仿真 2. ESP32可以使用microPython开发,相关sdk说明MicroPython(ESP32)快…

IndexDB

1 新建一个数据库 (1)在utils文件中新建一个indexedDB.ts export default class DB {private dbName: string // 数据库名称constructor(dbName: string){this.dbName dbName}// 打开数据库public openStore() {const request window.indexedDB.open(this.dbName,1)request…

关于linux openssl的自签证书认证与nginx配置

自签文档链接 重点注意这块,不能写一样的,要是一样的话登录界面锁会报不安全 域名这块跟最后发布的一致 nginx配置的话 server {listen 443 ssl; //ssl 说明为https 默认端口为443server_name www.skyys.com; //跟openssl设置的域名保持一致s…

GD32F4_CAN1无法进入接收中断

Q、GD32F450/470的外设CAN1按正常的初始化顺序配置后在正常和回环模式下都无法进入接收中断。 A、注意以下两点 【1】要使用CAN1的接收中断必须要开启CAN0的时钟 【2】CAN1的接收过滤序号应设置为15

肖sir__linux详解__001

linux详解: 1、ifconfig 查看ip地址 2、6版本:防火墙的命令: service iptables status 查看防火墙状态 service iptables statrt 开启防火墙 service iptables stop 关闭防火墙 service iptables restart 重启防火墙状态 7版本: systemctl s…

【Flutter】Flutter 使用 Shimmer 实现闪光效果的加载动画占位符

【Flutter】Flutter 使用 Shimmer 实现闪光效果的加载动画占位符 文章目录 一、前言二、为什么选择 shimmer 以及其安装和基本使用1. 闪光效果在 UI 设计中的价值2. shimmer 与其他类似工具的比较3. 如何在 Flutter 项目中安装 shimmer4. 基本使用方法和代码示例 三、深入了解 …

Activity基础之开发环境

工欲善其事必先利其器。 一、Android开发工具AndroidStudio安装以及环境搭建。 AS下载路径:https://developer.android.google.cn/studio AS历史版本下载路径:https://developer.android.google.cn/studio/archive?hlzh-cn 安装过程省略。。。 Jav…

C语言每日一练----Day(12)

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字:最大连续1的个数 完全数计算 💓博主csdn个人主页&#xff1…

Python数据分析案例30——中国高票房电影分析(爬虫获取数据及分析可视化全流程)

案例背景 最近总看到《消失的她》票房多少多少,《孤注一掷》票房又破了多少多少..... 于是我就想自己爬虫一下获取中国高票房的电影数据,然后分析一下。 数据来源于淘票票:影片总票房排行榜 (maoyan.com) 爬它就行。 代码实现 首先爬虫获…

【css】z-index与层叠上下文

z-index属性用来设置元素的堆叠顺序,使用z-index有一个大的前提:z-index所作用元素的样式列表中必须有position属性并且属性值为absolute、relative或fixed中的一个,否则z-index无效。 层叠上下文 MDN讲解 我们给元素设置的z-index都是有一…

selenium中定位shadow-root,以及获取shadow-root内部的数据

通过shadow-root的父级定位到shadow-root,再通过语句进行操作 两种方法: 第一种,Python种JS实现 第二种,selenium实现 1.0 案例网站 参考某橘色网站 2.0 js语句定位 可在控制台进行测试 测试语句 document.querySelector("ali-ba…

猫头虎博主解析:Spring中的“Unknown return value type: java.lang.Boolean“问题

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

纽扣电池做CE认证 需要的介绍 EMC检测、RED检测和LVD检测

认证需要测试什么项目 1、EMC检测项目:传导骚扰、辐射骚扰、静电放电抗扰度、射频电磁场辐射抗扰度、电快速瞬变脉)冲群抗扰度、浪涌(冲击)抗扰度、射频场感应的传导抗扰度、工频磁场抗扰度、电压暂降、短时中断和电压变化抗扰度、谐波电流、电压波动和闪烁。 2、LVD检测项目:…

Laf 中大猫谱:让每一只流浪猫都有家

猫谱简介 中大猫谱是一款辅助校园流浪猫救助的开源小程序项目,服务端使用 Laf 云开发。 猫谱主要功能包括:猫咪信息登记、照片分享、拍照识猫、公告和留言等。项目创立的初衷,是解决校园猫猫交流群里的一个常见问题:问猫猫是谁。…

NLP模型(五)——Transformer模型介绍

文章目录 1. Transformer结构2. Encoder结构2.1 Transformer输入2.2 相对位置编码2.3 Self-Attention2.4 Multi-Head Attention2.5 Encoder 整体 3. Decoder结构3.1 带Mask的Multi-Head Attention3.2 Multi-Head Attention 4. 预测层 1. Transformer结构 Transformer的结构如下…

go锁--读写锁

每个锁分为读锁和写锁,写锁互斥 没有加写锁时,多个协程都可以加读锁 加了写锁时,无法加读锁,读协程排队等待 加了读锁,写锁排队等待 w:互斥锁作为写锁 writerSem:作为写协程队列 readerSem:作为读协程队列 readerCoun…

Linkedin营销小技巧,开发客户必看

众所周知,Linkedin是发展业务、拓展人脉的好地方,在过去的一年里,93%的B2B营销人员最常使用该平台来有机分发内容。Linkedin也因为能产生较好的营销效果而成为跨境业务开发的选择平台。 有些企业可以使用Linkedin向潜在用户进行营销和接触&a…

Leetcode1006笨阶乘

思路:以4为一个分组分别进行处理 class Solution:def clumsy(self, n: int) -> int:answer_dict {0:0,1: 1, 2: 2, 3: 6, 4: 7}if n > 4:answer n * (n - 1) // (n - 2) n - 3n - 4else:print(answer_dict[n])return answer_dict[n]print(answer)while n …

2023年京东方便食品行业数据分析(京东数据报告)

​疫情中方便食品的销售一度火爆,但随着当前消费场景的开放,方便食品销售又恢复常态并开始下滑。根据鲸参谋电商数据分析平台的相关数据显示,今年7月份,京东平台方便食品的销量为800万,环比降低约23%,同比降…