在 Node.js 中实现 JWT 身份验证

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

随着前端应用的快速发展,大部分 Web 应用和移动应用都需要进行用户身份认证。JWT(JSON Web Token)就是现在最流行的一种身份认证方式之一。本文将介绍如何在 Node.js 中实现JWT身份验证。

JWT 的原理

JWT 是一种 JSON 格式的令牌,用于在客户端和服务端之间传递信息。它由三个部分组成:

  1. 头部(Header):包含算法类型和令牌类型。
  2. 负载(Payload):包含用户身份信息等数据。
  3. 签名(Signature):用于验证令牌的真实性,防止被篡改。

在使用时,服务端在客户端登录验证通过后,颁发一个 JWT 令牌给客户端。客户端将该令牌包含在请求 Header 或 Cookie 中发送到服务端,服务端通过解码和验证令牌来验证用户身份。

实现 JWT 身份验证

安装依赖

安装 jsonwebtoken 模块来生成和验证 JWT 令牌。

--- ------- ------ ------------

生成 JWT 令牌

在后台用户登录验证通过后,可以生成一个 JWT 令牌并返回给客户端,让客户端使用该令牌进行后续操作。例如,下面是使用 jsonwebtoken 模块生成 JWT 令牌的代码:

----- --- - ------------------------
----- ------ - ------------------ -- ------

----- ----- - ---------- ------- ----- -- ------- - ---------- ---- ---

其中,第一个参数 { userId: '123' } 表示负载中的用户信息(可以自定义其它属性),第二个参数 secret 表示服务端使用的密钥,第三个参数 { expiresIn: '1h' } 表示令牌的有效期为 1 小时。

解码和验证 JWT 令牌

客户端发送带 JWT 令牌的请求到服务端后,需要在服务端对该令牌进行解码和验证,来确定客户端请求的用户身份是否正确。例如,下面是使用 jsonwebtoken 模块解码和验证 JWT 令牌的代码:

----- --- - ------------------------
----- ------ - ------------------ -- ------

----- ----------- - ----- ---- ----- -- -
  ----- ----- - ---------------------------------- ------ -- --- ------ --- --- --
  ----------------- ------- ----- -------- -- -
    -- ----- -
      ------ ---------------------- -------- --------------- -------- ---
    -
    ---------- - --------------- -- --- -- --------------
    -------
  ---
--

其中,verifyToken 是一个 Express 中间件,用于在客户端请求处理前对 JWT 令牌进行解码和验证。在解码和验证后,如果令牌验证失败,则向客户端返回 401 错误,并阻止该请求继续处理。如果令牌验证成功,则将用户 ID 存储到请求对象中,供后续处理使用。

总结

本文介绍了如何在 Node.js 中实现 JWT 身份验证,包括生成和验证 JWT 令牌的代码。在实际开发中,考虑到 JWT 令牌有一定的安全风险,可以采用一些额外的安全手段来加强身份验证的安全性,例如防止 JWT 令牌的被窃取和重复使用等。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65b32a63add4f0e0ffc3b85f


猜你喜欢

  • 如何在 Mocha 中使用 ES6 的扩展运算符语法

    简介 Mocha 是一款流行的 JavaScript 测试框架,可用于测试前端和 Node.js 应用。ES6 引入了扩展运算符语法,可以大幅度提高代码的易读性和可维护性。

    9 个月前
  • RxJS 中使用 debounce 操作符实现输入框搜索

    随着 Web 应用程序变得越来越复杂,实时更新和数据流变得越来越重要。RxJS 是一款用于处理异步和基于事件的程序的库,可以更好地处理这些数据流。 RxJS 提供了许多操作符,其中 debounce ...

    9 个月前
  • ECMAScript 2020:解构赋值默认值的最佳实践

    前言 ECMAScript 2020(简称 ES2020)是 JavaScript 语言的最新标准,它包含了很多新特性和改进。其中一个重要的更新是引入了解构赋值的默认值语法。

    9 个月前
  • MongoDB 的 undo log 和 redo log 机制

    在 MongoDB 中,undo log 和 redo log 机制是非常重要的数据恢复机制。这两个机制可以在数据库发生崩溃或错误时,通过回滚和恢复来保护数据的完整性。

    9 个月前
  • ES10 中的 Array.includes() 方法详解及使用示例

    ES10 中的 Array.includes() 方法详解及使用示例 在过去的 JavaScript 中,想要检测一个数组中是否包含某个元素,我们通常会使用 indexOf() 方法。

    9 个月前
  • 如何使用 Docker 优化 Go 应用程序性能

    Docker是一种轻量级的虚拟化技术,可以将应用程序和其依赖项打包成一个可移植的镜像,以在任何地方运行。当然,Docker的使用也可以用于优化Go应用程序的性能,本文将介绍如何使用Docker进行优化...

    9 个月前
  • JavaScript 中使用 ES12 的可选链语法解决 undefined 错误

    在使用 JavaScript 进行开发时,我们经常会遇到 undefined 错误。这种错误通常由于没有正确地检查变量或属性的值而导致的。在过去,为了避免这种错误,我们通常会使用一系列的 if-els...

    9 个月前
  • Express.js 中使用 connect-flash 进行消息传递

    在使用 Express.js 进行 Web 开发时,有时需要在不同的请求之间传递一些简短的消息,如提示用户操作成功或失败等。为了方便处理这些消息,我们可以使用 connect-flash 中间件。

    9 个月前
  • 解决 babel-plugin-transform-runtime 安装失败问题

    问题背景 在使用 babel 进行代码转换时,我们经常会使用 babel-plugin-transform-runtime 插件来避免由于代码转换后浏览器缺失某些内置对象、方法等引发的运行时错误。

    9 个月前
  • Deno 中的 WebSocket 事件监听器

    WebSocket 是一种用于实现客户端和服务器之间双向通信的通信协议。它允许客户端和服务器之间进行实时传输,并提供了一种更低延迟的方式来进行数据交换。Deno 是一个用于运行 JavaScript ...

    9 个月前
  • 遇到 React 报错: Uncaught ReferenceError: require is not defined ,该如何解决?

    遇到 React 报错: Uncaught ReferenceError: require is not defined ,该如何解决? 当我们在使用 React 进行前端开发时,有时会遇到 Unca...

    9 个月前
  • Docker Swarm 集群上部署 Redis

    Docker 是一种容器化技术,已被广泛应用于前端领域。而 Docker Swarm 是 Docker 的一种集群技术,可以在多个 Docker 主机上创建服务,并对容器进行管理。

    9 个月前
  • 解决 ES6 在 IE 浏览器下的兼容问题

    随着前端技术的发展,ES6(ECMAScript 2015)成为了前端开发的标志性语言之一,然而它并不是所有浏览器都完全支持的,特别是在 IE 浏览器下,会出现各种兼容性问题。

    9 个月前
  • ES7 中的 Symbol 对象及其应用

    在 ES6 中,引入了 Symbol 数据类型,它是一种原始类型的数据,它的值是唯一的且不可变的。在 ES7 中,Symbol 对象得到了扩展和应用,本文将介绍 Symbol 对象的基本特性和应用场景...

    9 个月前
  • Kubernetes CronJob 实践指南:如何定期清理 Pod

    在 Kubernetes 中,Pod 是最基本的管理单元,而且 Pod 的数量非常庞大。而 Pod 生命周期的管理比较复杂,需要时刻关注它的创建、维持和清理。如果不及时对无用的 Pod 进行清理,将会...

    9 个月前
  • Tailwind 中如何控制元素的比例

    Tailwind.css 是适用于现代 WEB 开发应用的一款以功能和实用性为导向的 CSS 框架,它提供了一系列的样式和工具类名,使得我们可以快速的构建美观的用户界面,其中一个重要的功能就是控制元素...

    9 个月前
  • Flexbox 实现文本和图片排版的终极解决方案

    在前端开发中,页面排版是一个很重要的问题。而使用 Flexbox 布局可以让排版更加简单和灵活,尤其在同时存在文本和图片的情况下,Flexbox 更是能够提供一种终极的解决方案。

    9 个月前
  • 如何在 Hapi 中使用 NodeMailer 发送邮件?

    随着 Web 应用的发展,邮件是交流和传递信息的一种常见方式。在 Web 开发中,发送邮件是一个不可或缺的功能。Node.js 是一种优秀的服务器端技术,为了在 Hapi 框架中实现发送邮件,我们可以...

    9 个月前
  • Mongoose 的 save() 方法为什么会导致数据重复插入?如何解决?

    介绍 Mongoose 是一个优秀的基于 Node.js 平台的 MongoDB 数据库 ODM(对象-文档映射)工具,开发者可以使用它来快速地将 JavaScript 对象转换为 MongoDB 数...

    9 个月前
  • ECMAScript 2018 中的模板字符串更新及使用技巧

    在 ECMAScript 2018 中,模板字符串被添加了一些新特性,使得它更加强大和灵活。模板字符串在前端开发中被广泛使用,它可以帮助我们更加轻松地创建多行文本,以及进行字符串拼接等操作。

    9 个月前

相关推荐

    暂无文章