Node.js 中如何使用 JWT 实现用户认证

随着前端技术的快速发展,越来越多的应用需要进行用户认证。JWT(JSON Web Token)是一种广泛使用的用户认证解决方案,它不需要在服务器端存储会话信息,而是通过在客户端生成 token 实现用户认证。

本文将详细介绍 Node.js 中如何使用 JWT 实现用户认证,包含了以下内容:

  • JWT 原理介绍
  • 使用 Node.js 中的 jsonwebtoken 库生成和解析 JWT
  • 在 Express 中实现用户认证示例

JWT 原理介绍

JWT 是一种基于 JSON 的开放标准(RFC 7519),用于在网络中传递声明。它是一种 token 解决方案,它将用户身份信息和有效期等信息打包成一个 token,发送给客户端,客户端在后续的每次请求中都带上该 token,以证明自己的身份。

JWT token 由三部分构成:

  • Header:包含 token 类型(即 JWT)、加密算法等信息,通常是经过 Base64 编码的 JSON 字符串。
  • Payload:包含 token 的声明信息,比如用户 ID、姓名等信息,也可以包含额外的自定义信息。Payload 也是经过 Base64 编码的 JSON 字符串。
  • Signature:用于验证 token 是否被篡改,由 Header、Payload 和秘钥通过指定的加密算法生成,通常是字符串,不经过 Base64 编码。

JWT 的优点是无状态、可扩展和安全,但缺点是 token 在客户端本地存储,可能被攻击者盗取并误用,需要使用 HTTPS 等方式保障传输安全。

使用 Node.js 中的 jsonwebtoken 库生成和解析 JWT

Node.js 中提供了 jsonwebtoken 库,可以方便地生成和解析 JWT,以下是一个简单的示例代码:

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

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

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

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

其中 jwt.sign() 方法用于生成 JWT,接收三个参数:Payload 对象、秘钥和选项。Payload 对象可以包含任意的声明信息,秘钥用于生成 Signature,选项可以设置过期时间等。

jwt.verify() 方法用于解析 JWT token,接收三个参数:JWT token、秘钥和回调函数。回调函数接收两个参数:错误对象和解析后的 Payload 对象。

在 Express 中实现用户认证示例

以下是一个在 Express 中使用 JWT 实现用户认证的示例代码:

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

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

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

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

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

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

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

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

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

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

以上代码定义了三个接口:

  • /login:处理用户登录请求,通过用户名和密码验证成功后,返回 JWT token。
  • /profile:受保护的接口,需要在请求头中携带 JWT token,通过 verifyToken 中间件验证 token 合法性,才能返回用户信息。
  • verifyToken:中间件函数,用于验证 JWT token 合法性。如果 token 不合法或已过期,返回 401 状态码和错误信息;如果合法,将解析后的 userId 存储在请求对象上,供受保护的接口使用。

该示例代码演示了如何使用 JWT 实现用户认证,如果你正在构建一个需要用户认证功能的 Node.js 应用,可以参考此示例代码进行开发。

总结

本文详细介绍了 Node.js 中如何使用 JWT 实现用户认证,包含了 JWT 的原理、jsonwebtoken 库的使用和在 Express 中实现用户认证的示例代码。JWT 是一种安全、可扩展的用户认证解决方案,它不需要在服务器端存储会话信息,可以方便地应用于各种前端应用中。

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


猜你喜欢

  • Jest 中测试 React 组件时常见的问题及解决方案

    Jest 是一个非常流行的 JavaScript 测试框架,在 React 项目中使用 Jest 进行单元测试是非常常见的。不过,在实际使用中,我们经常会遇到一些问题。

    1 年前
  • Docker 容器中如何使用 Traefik 实现反向代理

    随着网站和应用技术的不断发展,前端应用的开发越来越复杂,同时验证应用的效率与准确性也变得更加重要。一个常用的验证方法就是使用反向代理,而 Traefik 是一种现代化的反向代理软件。

    1 年前
  • 使用 ES7 中的指数运算符简化代码

    使用 ES7 中的指数运算符简化代码 随着 Web 工程的发展,前端语言也趋向于更加高级,这也让开发者在编程时能够更加轻松和高效地实现功能。其中,ES7(ECMAScript 2016)中的指数运算符...

    1 年前
  • Sequelize 中如何使用 group by 和 having 子句?

    当我们需要在 SQL 语句中对数据进行分组统计时,经常需要使用 group by 和 having 子句。在 Sequelize 中也可以通过相应的方法来实现这些功能。

    1 年前
  • 使用 Babel 解决 Vue 项目在 IE 中报错的问题

    在现代的前端开发中,Vue 作为一款流行的前端框架,在被广泛使用的同时,也面临着一些问题。特别是在 IE 浏览器中,由于其对 ES6 的支持不完全,导致Vue项目在IE中出现了许多问题,如语法错误、缺...

    1 年前
  • RxJS 的 debounceTime 与 throttleTime 区别及使用场景

    RxJS 是一个优秀的 JavaScript 响应式编程库,它提供了丰富的操作符,用于处理异步数据流。其中,debounceTime 和 throttleTime 这两个操作符被广泛应用于前端开发中,...

    1 年前
  • 使用 Custom Elements 编写高质量的 React 组件

    React 是现在最流行的前端框架之一,因为它具有非常好的组件化开发模式和优秀的性能。尽管 React 提供了一些非常好的内置组件,但是在某些情况下,我们需要编写自定义的组件来实现某种特定的需求。

    1 年前
  • Next.js 中的数据预取技巧

    随着 web 应用程序复杂度不断增加,在 Next.js 应用程序中进行数据预取变得越来越重要。本文将介绍 Next.js 中如何使用数据预取技巧,以优化用户体验和性能。

    1 年前
  • Web Components 实践,自己写组件还是选用现成的?

    随着 Web 技术的不断发展,Web Components 引入了一种全新的思路,可以让我们更加简单方便地构建组件化的 Web 应用程序。但是在实践中,我们面临着一个问题:是自己写组件,还是选用现成的...

    1 年前
  • 如何在 Express.js 中使用 Session 实现用户验证

    在开发 Web 应用程序时,实现用户身份认证是非常重要的。使用 Session 是一个常见的方案。本文将介绍使用 Express.js 和 Session 来实现用户验证的方法及其相关代码实现。

    1 年前
  • ECMAScript 2019 全面解析:ES10 带来的新特性

    ECMAScript 2019(简称 ES10)发布于2019年6月,在本篇文章中将会详细讲解 ES10 带来的一些新特性。 数组的 flat 和 flatMap 方法 在 ES10 中,数组原型新增...

    1 年前
  • Fastify 帮助处理大型 JSON 数据的技巧

    近年来,越来越多的项目和应用需要处理大量的 JSON 数据。正常情况下,当处理大量 JSON 数据的时候,可能会遇到性能瓶颈以及处理效率低下的情况。在这种情况下,我们需要使用一些新的技术和工具来提高性...

    1 年前
  • 利用 ECMAScript 2015 中的模块化系统模块化你的代码

    利用 ECMAScript 2015 中的模块化系统模块化你的代码 前端开发已经变得越来越复杂和有挑战性,对于现代应用程序的需要,开发人员需要使用简洁的和可读的代码。

    1 年前
  • Headless CMS 在数字出版和阅读中的应用场景分析

    什么是 Headless CMS? Headless CMS 是一种与传统 CMS 不同的内容管理系统,它将内容与展示进行分离,提供 API 接口供前端调用,而不像传统 CMS 需要使用整合了展示代码...

    1 年前
  • ECMAScript 2020 带来的 Class Property Declarations:精简你的面向对象代码

    在当前的前端领域中,面向对象编程已经成为了一种非常流行和普遍的编程范式。其中,类是面向对象中的重要概念之一。而 ECMAScript 2020 引入的 Class Property Declarati...

    1 年前
  • React+Redux+Enzyme:测试 reducers

    在前端开发中,测试是不可或缺的一部分,而测试 reducers 是 Redux 中不可或缺的一部分。在这篇文章中,我们将使用 React、Redux 和 Enzyme 来测试 reducers。

    1 年前
  • LESS 中 background-image 路径错误解决方法

    LESS 中 background-image 路径错误解决方法 在前端开发中,我们经常会用到 LESS 这个 CSS 预处理器,它可以帮助我们更加优雅地编写样式。

    1 年前
  • 解决使用 Cypress 访问 https 网站遇到的 NET::ERR_CERT_AUTHORITY_INVALID 错误

    在使用 Cypress 进行测试时,有时候会遇到访问 https 网站时出现 NET::ERR_CERT_AUTHORITY_INVALID 错误的情况。这种情况通常是由于证书不受信任而引起的。

    1 年前
  • ES12 中的 String.prototype.replaceOne 方法介绍及示例

    在 JavaScript 中,字符串是不可变的,这意味着一旦创建字符串,就无法更改它。但我们可以使用一些方法来操作和转换字符串。ES12 引入了一个新的 String.prototype.replac...

    1 年前
  • Vue.js 中使用 v-model 双向数据绑定时出现的问题及解决方案

    vue.js 是一款流行的 JavaScript 框架,它提供了一种轻量级、高效的方式来创建单页面应用程序。其中 v-model 是 vue.js 中最常用的指令之一,它用于实现双向数据绑定,在表单元...

    1 年前

相关推荐

    暂无文章