从四个方面来看看 jwt 在node中的使用

nodejs中要怎么使用jwt?下面本篇文章就来给大家从四个方面介绍一下jwt的使用,希望对大家有所帮助!

从四个方面来看看 jwt 在node中的使用

导语:由于http是无状态的,请求响应过程中不存储记录用户身份信息,所以就出现了很多用户识别存储用户身份的方法,比如cookie,session,jwt。我最近做的一个接口服务使用了jwt来存储管理用户信息,相较于本地cookie存储,服务器端session存储,jwt就变得比较安全和节省方便,本文就jwt在node服务中的使用方法做一个简单的总结。

目录

jwt简介安装配置封装方法实战练习

本文从以上四个方面介绍jwt的使用。

jwt简介

概念

JWT全称JSON Web Token,它是一种开放标准RFC 7519,定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。JWT可以使用密钥或使用RSA或ECDSA的公钥/私钥对进行签名,可以对签名进行验证。

组成部分

jwt签名令牌一般由三部分组成,分别是Header(头部信息),Payload(载荷),Signature(签名),例如xxxxx.yyyyy.zzzzz

header

一般是存储令牌的类型和签名算法,比如:

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

Payload

一般是存储声明,也就是用户信息和附件数据,分为注册声明、公共声明和私人声明。

比如:

{  "sub": "1234567890",  "name": "John Doe",  "admin": true}

签名

利用签名算法对Header和Payload进行签名

比如:

HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

那么一个标准的jwt签名令牌会是这样的eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

应用场景

用户授权访问

比如用户登录后,服务端下发一个jwt令牌给客户端,每次用户请求数据都在请求头里面携带此令牌,服务端验证通过后可以获取到数据,这种方式开销很小,并不需要服务端进行存储,而且还可以跨域使用。

信息交换

在各方之间存储加密信息,验证签名内容是否篡改。

安全性

由于令牌可以被拆解,里面的header和Payload可以被解析看到,所以尽量不要在Payload里面存储一些私密的信息。

安装配置

下面就在node中使用jwt做一下操作。

在npm网站,有很多的jwt包,你可以选择你认为合适的。

四维时代AI开放平台 四维时代AI开放平台

四维时代AI开放平台

四维时代AI开放平台 66 查看详情 四维时代AI开放平台

搜索jwt

NAME                      | DESCRIPTION          | AUTHOR          | DATE       | VERSION  | KEYWORDSjwt                       | JSON Web Token for…  | =mattrobenolt   | 2012-05-05 | 0.2.0    |express-jwt               | JWT authentication…  | =woloski…       | 2021-08-11 | 6.1.0    | auth authn authentication authz authorization http jwt token oauth expressjsonwebtoken              | JSON Web Token…      | =dschenkelman…  | 2019-03-18 | 8.5.1    | jwtjwt-decode                | Decode JWT tokens,…  | =jeff.shuman…   | 2020-11-16 | 3.1.2    | jwt browserpassport-jwt              | Passport…            | =themikenichol… | 2018-03-13 | 4.0.0    | Passport Strategy JSON Web Token JWTkoa-jwt                   | Koa middleware for…  | =stiang…        | 2021-09-24 | 4.0.3    | auth authn authentication authz authorization http jwt json middleware token oauth permissions koajsrsasign                 | opensource free…     | =kjur           | 2021-12-01 | 10.5.1   | crypto cryptography Cipher RSA ECDSA DSA RSAPSS PKCS#1 PKCS#5 PKCS#8 private key public key CSR PKCS#10 hash function HMac ASN.1 certexpress-jwt-permissions   | Express middleware…  | =angryunicorn…  | 2021-08-18 | 1.3.6    | express middleware JWT permissions authorization token securitynjwt                      | JWT Library for…     | =robertjd       | 2021-12-03 | 1.2.0    | jwtfastify-jwt               | JWT utils for…       | =starptech…     | 2021-12-03 | 4.1.0    | jwt json token jsonwebtoken fastifydid-jwt                   | Library for Signing… | =simonas-notcat… | 2021-12-03 | 5.12.1   | hapi-auth-jwt2            | Hapi.js…             | =nelsonic       | 2020-09-08 | 10.2.0   | Hapi.js Authentication Auth JSON Web Tokens JWTauth0-lock                | Auth0 Lock           | =jeff.shuman…   | 2021-11-02 | 11.31.1  | auth0 auth openid authentication passwordless browser jwtjwks-rsa                  | Library to retrieve… | =jeff.shuman…   | 2021-10-15 | 2.0.5    | jwks rsa jwtrestify-jwt-community     | JWT authentication…  | =frbuceta       | 2021-12-05 | 1.1.21   | auth authentication authorization http jwt token oauth restifydid-jwt-vc                | Create and verify…   | =simonas-notcat… | 2021-11-23 | 2.1.8    | jwt-service               | A simple wrapper…    | =nfroidure      | 2021-11-01 | 8.0.0    | jwt knifecycleangular-jwt               | Library to help you… | =jeff.shuman…   | 2019-03-20 | 0.1.11   |@thream/socketio-jwt      | Authenticate…        | =divlo          | 2021-07-23 | 2.1.1    | socket socket.io jwtappstore-connect-jwt-gene | [![NPM](https://nod… | =poad           | 2021-10-15 | 1.0.1    | jwt appstorerator-core                |

安装jwt

我个人觉得这个jsonwebtoken很不错,本文就使用这个包。

npm i jsonwebtoken

常见用法

签名

签名语法jwt.sign(payload, secretOrPrivateKey, [options, callback])

例如:

// 一般签名var jwt = require('jsonwebtoken');var token = jwt.sign({ foo: 'bar' }, 'secret');//  加私钥签名var privateKey = fs.readFileSync('private.key');var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256'});// 设置过期时间jwt.sign({  data: 'bar'}, 'secret', { expiresIn: 60 * 60 }); // 1h

验证

验证语法jwt.verify(token, secretOrPublicKey, [options, callback])

例如:

// 一般验证var decoded = jwt.verify(token, 'secret');console.log(decoded.foo) // bar// 公钥验证var cert = fs.readFileSync('public.pem');jwt.verify(token, cert, function(err, decoded) {  console.log(decoded.foo) // bar});

解码

解码语法jwt.decode(token [, options])

例如:

var decoded = jwt.decode(token, {complete: true});console.log(decoded.header);console.log(decoded.payload);

封装方法

根据安装配置里面的方法,可以根据自己的需要进行二次封装,更加适合自己的方法。

引入依赖包和配置

const jwt = require("jsonwebtoken");const config = {    secret: '2021123456**',    time: 60 * 60,}

签名

function create (data, time) {  let token = jwt.sign(data, config.secret, {    algorithm: "HS256",    expiresIn: time || config.time,  })  return token;}

验证

function verify (token) {  return jwt.verify(token, config.secret, function (err, decoded) {    if (err) {      return {        code: 1,        msg: 'invalid',        data: null,      }    } else {      return {        code: 2,        msg: 'valid',        data: decoded,      }    }  })}

解码

function decoded (token, complete = true) {  return jwt.decode(token, {    complete,  });}

上面是比较简单的方法,如果你还想使用公钥私钥,可以用上面安装配置里面介绍的那样。

实战练习

经过上面的封装方法,可以来实战演练一下,是否有效。

新建一个文件夹test,新建一个文件index.js用于存放测试案例,jwt.js用于存储调用方法。

mkdir testcd testnpm init -ynpm i jsonwebtoken

jwt方法

// jwt.jsconst jwt = require('jsonwebtoken');const config = {    secret: '2021123456', // 密钥    time: 60*60, // 过期时间}// 创建签名令牌function create (data, time) {    let token = jwt.sign(data, config.secret, {        algorithm: 'HS256',        expiresIn: time || config.time,    });    return token;}// 验证令牌function verify (token) {    return jwt.verify(token, config.secret, function (err, decoded) {      if (err) {        return {          code: 1,          msg: 'invalid',          data: null,        }      } else {        return {          code: 2,          msg: 'valid',          data: decoded,        }      }    })}// 解码令牌function decoded (token, complete = true) {    return jwt.decode(token, {      complete,    });}const token = {    create,    verify,    decoded,}module.exports = token;

创建token,验证token,解码token

// index.jsconst jwt = require('./jwt');// 生成令牌let token = jwt.create({'id': 1, 'name': 'mark'}, 60*60*2);console.log(token); /*eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8*/// 验证令牌let verifyRes = jwt.verify(token);console.log(verifyRes); /* {    code: 2,    msg: 'valid',    data: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 }}*/// 解码令牌let deRes = jwt.decoded(token, true);console.log(deRes);/*{  header: { alg: 'HS256', typ: 'JWT' },  payload: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 },  signature: '20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8'}*/

运行一下命令node index.js测试是否正确。

好了,以上就是jwt在node中的一些应用和实践方法!

更多node相关知识,请访问:nodejs 教程!!

以上就是从四个方面来看看 jwt 在node中的使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/553485.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
为什么华为手机上的应用卸载不了?教你快速清理顽固应用的步骤
上一篇 2025年11月9日 21:13:50
linux系统中的755权限是什么意思
下一篇 2025年11月9日 21:13:57

相关推荐

  • JavaScript 高效判断页面所有复选框状态的技巧与实践

    本文旨在提供一套高效且专业的javascript方法,用于判断网页中所有复选框的选中状态。我们将探讨如何利用`array.some()`快速确定是否有未选中的复选框(进而判断是否全部选中),以及如何使用`array.filter()`统计选中和未选中的复选框数量。通过优化dom元素选择和数组操作,提…

    2026年5月10日
    000
  • OSMnx中interpolate_points函数详解及街道细分与图构建实践

    本文详细介绍了osmnx库中`utils_geo.interpolate_points`函数的使用方法,特别是其返回的python生成器类型。我们将学习如何处理生成器输出,并提供一个完整的教程,演示如何利用此函数将现有街道几何体细分为更小的线段,进而构建一个精细化的网络图,以支持更细粒度的空间分析。…

    2026年5月10日
    000
  • 如何安全有效地从外部网页获取HTML元素数据并应用于自身页面

    本教程旨在解决如何在不同域名下,通过javascript获取并使用另一个网页的html元素数据。文章将深入探讨同源策略的限制,并提供两种主要解决方案:使用` 在现代Web开发中,有时我们需要从外部网站获取特定的HTML内容或属性值,并将其整合到我们自己的网页中。例如,从XYZ.COM/B.html页…

    2026年5月10日
    000
  • JS如何操作HTML元素_DOM编程核心方法【教程】

    必须掌握操作HTML元素的核心DOM方法:一、通过ID获取单个元素;二、通过类名获取元素集合;三、通过标签名获取元素集合;四、通过CSS选择器获取元素;五、为元素绑定事件监听器;六、创建并插入新元素;七、替换或删除现有元素。 如果您希望使用JavaScript动态修改网页内容、响应用户交互或构建交互…

    2026年5月10日
    000
  • Golang如何提升TCP长连接处理效率_Golang TCP长连接处理性能优化实践详解

    答案:通过非阻塞I/O、单Goroutine双工模型、sync.Pool对象复用、TCP_NODELAY优化及高效心跳管理,结合系统调优,可显著提升Golang百万级TCP长连接处理效率。 在高并发网络服务场景中,TCP长连接的处理效率直接影响系统的吞吐能力和资源消耗。Golang凭借其轻量级Gor…

    2026年5月10日
    000
  • 使用SMTP.js发送邮件:客户端集成、常见问题与最佳实践指南

    本文深入探讨了使用SMTP.js库在前端发送邮件时可能遇到的问题,特别是与Elastic Email集成时的挑战。我们将分析代码中常见的异步处理错误、条件函数定义陷阱,并提供修正后的代码示例和最佳实践。重点强调了正确处理Promise链、确保函数可访问性以及客户端邮件发送的安全考量,帮助开发者构建更…

    2026年5月10日
    000
  • 如何在不暴露密钥的情况下,在客户端创建 Stripe Payment Link

    本文介绍了在纯静态网站环境下,如何利用 Stripe Payment Link 实现商品售卖,并着重讨论了在不暴露 Stripe 密钥的前提下,客户端创建 Payment Link 的可行性。分析了直接在客户端使用密钥的风险,并提出了预先生成 Payment Link 或使用后端服务动态生成 Pay…

    2026年5月10日
    000
  • Windows用Prettier一键格式化乱码HTML代码

    首先确保HTML文件保存为UTF-8编码,使用文本编辑器另存为UTF-8格式;其次在命令行执行chcp 65001切换至UTF-8代码页后再运行Prettier;接着在VS Code中设置files.encoding为utf8并启用files.autoGuessEncoding;最后可通过Node.…

    2026年5月10日
    000
  • php怎么截取网页_php抓取网页内容的几种方法

    file_get_contents适用于静态页抓取,但受限于allow_url_fopen且无法执行JS;2. cURL支持自定义请求头、Cookie等,适合处理复杂HTTP请求;3. Guzzle作为现代PHP项目推荐方案,具备良好扩展性与异步支持;4. 动态渲染内容需借助Puppeteer或Se…

    2026年5月10日
    000
  • html函数如何实现动态内容显示 html函数在网页交互中的核心应用

    JavaScript函数通过操作DOM实现动态内容更新与交互,如显示时间、实时搜索、增删元素及加载数据,使网页具备动态功能。 HTML 本身没有“函数”的概念,它是一种标记语言,用于定义网页结构。真正实现动态内容显示和交互功能的是 JavaScript。通常所说的“HTML函数”其实是 JavaSc…

    2026年5月10日
    000
  • HTMLAMP怎么做_加速移动页面实现教程

    答案:HTML AMP通过规范标签、禁用自定义JS、引入AMP JS库和缓存技术提升移动页面加载速度,需遵循AMP HTML标准并验证有效性,有助于SEO但非万能,未来将更开放并与PWA等融合。 HTML AMP 旨在加速移动页面加载速度,提升用户体验。简单来说,它通过限制某些 HTML 功能,并采…

    2026年5月10日
    000
  • 理解PHP服务器端请求与浏览器开发者工具的限制

    当PHP脚本使用file_get_contents等函数发起服务器端请求时,这些请求直接在服务器上执行,而非通过浏览器。因此,浏览器开发者工具的网络活动面板无法捕获和显示这些内部的服务器间通信,因为它仅监控浏览器自身发出的网络请求,对服务器内部处理过程无感知。 客户端请求与服务器端请求的本质区别 在…

    2026年5月10日
    000
  • JavaScript DOM操作:点击关联元素获取目标文本内容的教程

    本教程详细介绍了如何通过JavaScript处理用户点击事件,并结合DOM的 closest() 和 querySelector() 方法,从复杂的HTML结构中准确获取目标元素的文本内容。文章强调了使用 addEventListener() 进行事件绑定、避免重复ID以及高效DOM遍历的最佳实践,…

    2026年5月10日
    000
  • 前端构建优化:利用常量折叠提升应用性能

    本文深入探讨了一种在构建阶段执行部分源代码以进行优化的技术——常量折叠(Constant Folding)。通过在编译时预计算表达式并替换为最终结果,该技术显著减少了运行时开销,提升了应用性能。文章将详细解释其工作原理、优势,并探讨其在现代前端构建工具中的应用与配置,旨在帮助开发者实现更高效的代码优…

    2026年5月10日
    000
  • JavaScript数据结构实现_javascript算法基础

    JavaScript中常用数据结构包括栈、链表和字典:1. 栈利用数组的push和pop实现LIFO,适用于括号匹配;2. 链表由节点组成,插入删除高效,适合频繁修改场景;3. 字典用对象实现键值对存储,常用于频率统计;4. 二分查找在有序数组中以O(log n)效率查找目标值,需数组已排序。掌握这…

    2026年5月10日
    000
  • JavaScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程

    本教程详细介绍了如何使用javascript实现井字棋(tic-tac-toe)游戏的核心交互逻辑。内容涵盖了如何遍历并为棋盘上的每个方格添加点击事件监听器,实现玩家x和o的交替落子,以及重置游戏状态的功能。通过提供的html、css和javascript代码示例,读者可以快速理解并构建一个基础的井…

    2026年5月10日
    000
  • 全栈JS代码怎么结构化_全栈JavaScript项目代码结构与规范指南

    采用分层+功能划分的目录结构,明确分离前后端代码;2. 遵循单一职责原则,路由、控制器、服务与模型各司其职;3. 统一命名规范并集成ESLint+Prettier保证代码风格一致;4. 使用环境变量管理配置,通过脚本实现自动化构建与并发启动服务。 全栈JavaScript项目涉及前端、后端、数据库交…

    2026年5月10日
    000
  • JavaScript模块加载机制_JavaScript代码组织规范

    现代前端推荐使用ES Modules,通过import和export实现静态依赖管理,配合合理目录结构与命名规范提升可维护性,注意浏览器与Node.js的运行差异。 JavaScript 的模块加载机制和代码组织规范是现代前端开发中的核心基础。随着项目规模扩大,良好的模块化设计能提升代码可维护性、复…

    2026年5月10日
    000
  • c++怎么实现一个静态代码分析工具_C++代码质量与静态分析工具开发

    静态代码分析工具通过解析源码构建AST,利用Clang框架实现未使用变量检测,结合ASTMatchers进行规则匹配,最终生成警告信息。 静态代码分析工具可以在不运行程序的前提下,检测出潜在的语法错误、编码规范问题、内存泄漏风险等。在C++中开发一个简单的静态分析工具,核心思路是解析源码并构建抽象语…

    2026年5月10日
    000
  • JavaScript模块化是什么_ES6模块和CommonJS有什么区别呢

    JavaScript模块化将代码拆分为独立可复用单元,ES6模块(import/export,编译时加载、实时引用)与CommonJS(require/module.exports,运行时加载、值拷贝)核心区别在于设计目标和运行机制不同。 JavaScript模块化是把代码按功能拆分成独立、可复用的…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信