在 Express.js 中使用 JSON Web Tokens 完成身份验证

JSON Web Tokens(JWT)是一种基于 JSON 的安全令牌,用于在不同系统之间传递信息。在前端开发中,JWT 被广泛使用来完成用户身份验证和授权。Express.js 是一个流行的 Node.js 框架,它提供了方便的中间件来处理 JWT。在本文中,我们将探讨如何在 Express.js 中使用 JWT 完成身份验证,包括 JWT 的基础知识、在 Express.js 中使用 JWT 的步骤,以及一些实用的示例代码。

JWT 基础知识

在开始使用 JWT 之前,我们需要先了解一些基础知识。JWT 由三部分组成:Header、Payload 和 Signature。它们用一个点号(.)连接在一起组成一个完整的 JWT。

Header

Header 部分通常由两部分组成:令牌类型(typ)和算法(alg)。令牌类型指定为 JWT,算法指定为用于签名 JWT 的 HMAC、RSA 等算法。

比如,以下是一个 JWT 的 Header 示例:

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

Payload

在 JWT 的 Payload 中包含了一些关键的数据,比如用户 ID、权限信息等。Payload 可以包含任意数量的键值对,并且可以任意扩展。

比如,以下是一个 JWT 的 Payload 示例:

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

在这个例子中,Payload 中包含了用户的 ID(sub)、用户的名字(name)以及 JWT 的签发时间(iat)。

Signature

Signature 是使用转换后的 Header 和 Payload 进行签名的字符串。使用 Signature 可以确保 JWT 没有被篡改,同时也可以防止未授权的伪造 Token。

比如,以下是一个 JWT 的 Signature 示例:

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

其中,secret 是用于生成签名的密钥,这个密钥只有服务器才知道。

在 Express.js 中使用 JWT 的步骤

1. 安装 JWT 库

在使用 JWT 之前,我们需要先安装一个 Node.js 的 JWT 库。比较流行的库有 jsonwebtoken 和 node-jwt-simple,我们可以通过 npm 来安装:

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

2. 创建 JWT

在 Express.js 中,我们可以通过使用 jsonwebtoken 库来创建 JWT。以下是一个示例代码:

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

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

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

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

在这个示例中,我们使用 jwt.sign 方法创建了一个 JWT。该方法接受三个参数:

  • payload:JWT 的 Payload 数据;
  • secretKey:用于签名的秘钥;
  • options:一些选项,比如过期时间等。

3. 验证 JWT

在 Express.js 中,我们可以使用中间件来验证 JWT。以下是一个示例代码:

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

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

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

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

在这个示例中,我们使用了 Express.js 的中间件来验证 JWT。在每个请求中,我们首先检查 Authorization 头是否包含了 Token。如果没有 Token,我们就返回一个 401 的未授权错误;否则,我们使用 jwt.verify 验证 Token。如果 Token 验证通过,我们将解码后的数据存储在 req.user 中,并通过 next() 继续处理请求;否则,我们返回一个 401 的非法 Token 错误。

实用示例代码

生成 JWT

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

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

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

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

验证 JWT

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

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

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

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

总结

本文介绍了 JWT 的基础知识,以及如何在 Express.js 中使用 JWT 完成身份验证。在实际开发中,我们可以使用 JWT 快速地搭建一个安全的身份验证系统。希望这篇文章对大家有帮助。

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


猜你喜欢

  • 如何使用 Deno 中间件优化开发流程?

    前端开发是一个不断变化和发展的领域,而 Deno 中间件已经成为了开发者广泛使用的工具之一。这篇文章将向您介绍如何使用 Deno 中间件来优化您的前端开发流程和减少代码重复。

    1 年前
  • 使用 Enzyme 和 Mocha 来测试 ES6 React 组件

    导语 在前端开发中,React 是非常流行的一种技术,但是如何进行有效的测试却是开发人员需要面对的问题之一。本文将为你介绍如何使用 Enzyme 和 Mocha 来测试 ES6 React 组件,让你...

    1 年前
  • Fastify 框架中 Access Token 生成与校验

    前言 在现代的 Web 应用程序中,认证和授权(Authentication and Authorization)是一个非常重要的问题。AccessToken 作为一种常见的认证方式,也被广泛应用在各...

    1 年前
  • Babel6 处理浏览器全局对象

    Babel 是一个 JavaScript 编译器,旨在将现代语法转换为浏览器可以理解的旧语法版本。在 Babel 6 中,有一个插件可以很好地处理浏览器全局对象的变量。

    1 年前
  • 如何解决 SPA 项目加载速度慢的问题

    单页面应用(SPA)是目前较为流行的前端开发方式,但是在实际开发中,很多 SPA 项目都存在着加载速度慢的问题。本文将从多个方面详细介绍如何解决 SPA 项目加载速度慢的问题,包括代码体积优化、文件缓...

    1 年前
  • 如何在 Hapi 框架上记录 API 请求历史

    前言 Hapi 是一个强大的 Node.js Web 应用程序框架,它提供了一整套工具和插件,帮助我们构建高效且易于维护的 Web 应用程序。在现代的 Web 应用程序中,API 是不可或缺的组成部分...

    1 年前
  • 如何在 GraphQL 中处理使用日期时的错误

    在网页应用程序的开发中,后端通常会返回许多数据,包括日期形式的数据。GraphQL 作为一种查询语言和运行时环境,可以用于处理这些数据。但是,在使用日期时,常常会遇到各种错误,例如时区问题、日期格式不...

    1 年前
  • 使用 Next.js 快速构建个人博客的经验分享

    如果你是一名前端开发者,想要搭建一个属于自己的个人博客,那么 Next.js 可能是一个不错的选择。Next.js 是一个基于 React 的服务端渲染框架,它可以帮助我们快速构建一个高性能的网站,而...

    1 年前
  • Cypress 测试框架中的重试机制

    在前端开发过程中,测试框架扮演着重要的角色,它可以帮助我们发现代码中的错误和问题。Cypress 是一个现代化的、面向 Web 开发者的前端自动化测试框架。它具有易于使用、高效、快速的特点,让测试工作...

    1 年前
  • TypeScript 中如何使用装饰器增强代码功能

    在前端开发中,TypeScript 已经成为许多开发者的首选语言之一。与 JavaScript 相比,TypeScript 能够帮助你更好地管理代码和降低出错风险。

    1 年前
  • Material Design 中 CardView 的使用方法详解

    Material Design 是 Google 推出的一种设计语言,旨在创造出一个连贯、有层次感、具有意义和美感的 UI。其中,CardView 是 Material Design 中最常见的 UI...

    1 年前
  • 如何在 LESS 中使用 calc() 函数?

    在前端开发中,经常需要进行一些样式的计算。为了更好的维护和灵活的控制样式,我们可以使用 CSS 的 calc() 函数。但是,如果使用纯 CSS,写起来就会有些繁琐,而且不够灵活。

    1 年前
  • Kubernetes 中的 Pod 与容器管理实践

    在 Kubernetes 中,Pod 是最小的可部署对象。它是一个逻辑主机,可以包含单个或多个容器。在本文中,我们将介绍 Kubernetes 中的 Pod 和容器管理实践,包括 Pod 的概念、Po...

    1 年前
  • 如何在 Custom Elements 中使用 JavaScript 事件

    在前端开发中,使用自定义元素(Custom Elements)可以让我们创造出更加灵活、可维护的组件和界面。事件是 JavaScript 中不可或缺的一部分,它可以让我们实现很多复杂的交互和逻辑。

    1 年前
  • 如何使用 Socket.io 实现实时数据可视化

    在 Web 开发中,实现实时数据可视化是非常重要的。这可以帮助我们追踪数据并及时作出决策。Socket.io 是一个开源的 JavaScript 库,它使得实现实时数据可视化变得容易。

    1 年前
  • 使用 Chai 测试浮点数

    浮点数是在计算机科学中常用的数据类型。然而,由于计算机内部表示浮点数的方式,精度问题经常会给程序员带来麻烦。 在前端开发中,浮点数往往用于计算和比较,如计算金额,计算滚动条位置等,因此精度问题更加重要...

    1 年前
  • RxJS 中操作符 merge 的实战应用

    在现代的前端开发中,越来越多的应用需要实时地处理不同的异步数据流。这时候,我们需要一个能够帮助我们轻松地管理和合并这些异步数据流的工具。RxJS 是一个非常强大的响应式编程库,它提供了一系列的操作符来...

    1 年前
  • PWA 应用中缓存清理方案

    什么是 PWA? PWA (Progressive Web App)是一种基于 Web 技术构建的应用程序,运行在浏览器中,提供类似原生应用的体验。PWA 可以在离线状态下运行,支持消息推送、添加到主...

    1 年前
  • 使用 CSS Reset 后,如何解决默认图片样式被重置的问题

    在前端开发中,我们经常会使用 CSS Reset 来规范化不同浏览器之间的差异,以达到更好的兼容性和一致性。然而,使用 CSS Reset 会带来一些不可避免的问题,其中之一就是默认图片样式被重置导致...

    1 年前
  • ES7 中 Object.values() 和 Object.entries() 的使用方法

    ES7 是 JavaScript 的最新版本之一,它为开发者带来了许多新的特性和语法糖。其中,Object.values() 和 Object.entries() 就是 ES7 中的两个有趣的新功能。

    1 年前

相关推荐

    暂无文章