如何利用 Express.js 实现基于 JSON Web Tokens 的身份认证

在现代应用程序中,身份认证是一个重要的话题。为了确保数据的安全性,必须对用户进行身份验证。一种有效的身份验证方式是使用基于 JSON Web Tokens 的身份认证机制。在本文中,我们将探讨如何使用 Express.js 实现基于 JSON Web Tokens 的身份认证。

什么是 JSON Web Tokens?

JSON Web Tokens(JWT)是一种可以通过互联网传递的安全的身份验证机制。JWT 由三部分组成:头部,数据负载和签名。头部包含有关令牌的元数据,如算法和令牌类型。数据有效负载包含有关已经授权的用户的信息。签名是用于验证令牌的密钥。

当用户通过身份验证并在服务器上进行了登录,服务器为用户发放 JWT。此时,服务器将 JWT 发送回客户端,以便以后当客户端请求受限制的操作时,服务器能够验证其身份。此后,客户端必须在每个请求中使用该 JWT,以向服务器证明其身份。

如何使用 Express.js 实现 JSON Web Tokens 身份认证

我们将使用 Express.js 来实现 JSON Web Tokens 身份认证。

Step 1: 安装所需的软件包

要使用 Express.js 实现 JSON Web Tokens 身份认证,我们需要使用以下软件包:

  • express:用于构建 Web 应用程序。
  • jsonwebtoken:用于生成和验证 JWT。

我们可以使用以下命令安装它们:

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

Step 2: 创建路由

在使用 Express.js 进行身份验证时,我们需要为登录和注销创建路由。

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

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

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

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

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

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

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

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

在上面的代码中,我们创建了两个路由:一个用于登录,一个用于注销。

在登录路由中,我们首先获取用户提交的用户名和密码。然后,我们可以使用这些凭据来验证用户。如果用户通过了身份验证,我们将生成一个 JWT,并将其作为 JSON 响应发送回客户端。

在注销路由中,我们只是向客户端发送一个消息,并没有执行任何其他操作。

Step 3: 添加身份验证中间件

现在,我们需要在路由上添加一个身份验证中间件,以确保只有经过身份验证的用户可以访问受保护的资源。

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

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

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

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

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

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

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

        -------
    ---
-

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

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

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

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

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

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

在上面的代码中,我们定义了一个名为 authorize 的中间件。该中间件检查请求头中是否存在 JWT。如果 JWT 不存在,则返回 403 错误;否则,它将验证 JWT 的签名,并从有效负载中获取用户信息。最后,它将用户信息添加到请求体中,并将请求流程传递给下一个路由。

Step 4: 使用 Postman 进行测试

现在,我们已经完成了 JSON Web Tokens 身份认证,并已准备好使用 Postman 进行测试。首先,我们需要使用 Postman 发送一个登录请求:

在上面的请求中,我们在请求体中提供用户名和密码。当服务器接收到该请求时,它将验证提供的凭据,并按照上述流程返回一个 JWT。

接下来,我们可以使用该 JWT 来访问受保护的资源。为此,我们需要将 JWT 添加到请求头中:

在请求头中添加 JWT 后,我们将能够成功访问受保护的资源:

当我们在没有 JWT 的情况下尝试访问受保护的资源时,服务器会拒绝我们的请求:

总结

在本文中,我们学习了如何使用 Express.js 实现基于 JSON Web Tokens 的身份认证。我们定义了登录和注销路由,并将身份验证中间件添加到了受保护的路由中。最后,我们使用 Postman 进行了测试,并证明了我们的身份验证机制是有效的。

我们希望这篇文章能够帮助您了解身份验证的基础知识,并且能够启发您在自己的项目中实现身份验证机制。

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


猜你喜欢

  • Webpack 如何优化 dll 的构建速度

    Webpack 是现代前端开发中非常重要的工具,它能够将多个 JavaScript 文件打包成一个或多个文件,以及将 CSS、图片等静态资源打包进去,提供了一种方便和可扩展的前端构建方式。

    1 年前
  • Material Design 中使用 Chip 实现标签效果

    在现代 Web 设计中,标签成为了一项必备的元素。标签能够提供有用的指示并使内容更易于理解和搜索。Material Design 中,Chip 是一种常用的元素,用于创建小型且易于识别的交互式元素,特...

    1 年前
  • ECMAScript 2020 中的 globalThis 对象解决跨平台问题

    在现代的前端开发中,越来越多的应用程序需要在多个平台上运行,如浏览器、Node.js 和 Web Workers。为了实现跨平台的功能,开发人员需要知道如何在不同的平台上访问全局对象,这对于编写可重用...

    1 年前
  • 使用 Jest 测试 Vue 组件的接口规范

    在 Vue 应用的前端开发过程中,组件测试是一项不可或缺的工作。组件测试可以保证组件的质量和稳定性,减少出现错误或者 bug 的概率。而 Jest 是一个流行的 JavaScript 测试框架,为 V...

    1 年前
  • 如何在 TypeScript 中使用 React 的新特性

    在开发现代 Web 应用程序时,React 成为了越来越多的开发者和企业的首选框架。TypeScript 也因为其类型安全、易于维护的特性而被大家所熟知。React 与 TypeScript 的结合,...

    1 年前
  • 在 Kubernetes 中使用 Secret 实现敏感信息管理

    在现代的云原生环境中,应用程序往往需要访问各种敏感信息,例如数据库密码、API 密钥、证书等等。保护这些敏感信息,防止它们被未经授权的人员访问,是应用程序安全的重要一环。

    1 年前
  • ECMAScript 2021 (ES12) 中如何使用 Subclassing 来继承类

    在 ECMAScript 2021 (ES12) 中,Subclassing 是一种新的继承方式,它使得我们可以更方便地继承类,同时也更容易处理错误和异常情况。本文将详细介绍 Subclassing ...

    1 年前
  • 解决 Vue-router 中没有嵌套关系的路由之间跳转 bug 的详细方案

    在使用 Vue-router 进行路由跳转时,有时会遇到没有嵌套关系的路由之间跳转的 bug,例如从 /page1 跳转到 /page2,再返回到 /page1 时,会发现 /page1 的状态被重置...

    1 年前
  • 使用 AngularJS 中的 $filter 服务进行数组的排序和过滤

    AngularJS 是一个流行的前端框架,提供了丰富的服务来简化前端开发。其中,$filter 服务是一个非常有用的服务,可以帮助我们对数组进行排序和过滤。在本文中,我们将学习如何使用 $filter...

    1 年前
  • Fastify 中的异常处理方式和最佳实践

    作为一名前端开发者,我们经常要处理大量的异步操作。因此,异常处理是前端开发中不可避免的一部分。在 Node.js 中,有许多流行的 Web 框架可以帮助我们快速开发 Web 应用程序。

    1 年前
  • 无障碍设计:如何解决网站中多媒体无法访问的问题?

    现今许多网站都已经重视无障碍设计,并且为视觉障碍用户提供了无障碍辅助功能,例如屏幕阅读器、放大镜等。但是,很多网站还存在一个重要的问题:多媒体文件无法访问。 许多用户因为听力、视觉、认知缺陷等原因,无...

    1 年前
  • 如何在 Koa 应用中使用 WebSocket

    简介 WebSocket 是一种基于 TCP 协议的双向通信协议,它可以在客户端和服务器之间建立持久性的连接,达到实时通信的目的。在前端开发中,WebSocket 已经被广泛应用于实现实时通信、在线聊...

    1 年前
  • Flexbox 布局中如何实现固定间距

    在前端开发中,布局是非常重要的一块。而在布局中,Flexbox 布局已经成为了一种被广泛使用的方式。但是在实现的过程中,可能会遇到一些固定间距的问题。这时,我们就可以使用 Flexbox 的一些技巧来...

    1 年前
  • Deno 中如何实现服务器集群?

    简介 Deno 是一个基于 V8 引擎的 TypeScript 运行时,由原 Node.js 作者 Ryan Dahl 主导开发,它提供了浏览器环境下的 API 和一些 Node.js 没有的功能。

    1 年前
  • Headless CMS 与静态网站构建技术的优劣及选择指南

    什么是 Headless CMS? Headless CMS 是一种分离了内容管理系统的前后端技术架构,也称为 API-first CMS。传统的 CMS 通常是将内容管理和网站构建放在一起的,而 H...

    1 年前
  • ES9 中如何使用异步迭代器处理数据流

    在开发现代 Web 应用程序时,需要处理大量的数据流。ES9 引入了异步迭代器来处理这些数据流,使处理过程更加高效和可靠。 异步迭代器简介 异步迭代器是一种对象,它允许在异步数据流中进行迭代操作。

    1 年前
  • 如何在 Event Grid 上实现 Serverless 计算

    前言 Serverless 是近年来出现的一种新型计算模型,其核心理念是让开发者只需编写代码,无需关注底层基础设施的运维,简化了应用开发和部署的流程。而在 Serverless 计算中,可以通过事件驱...

    1 年前
  • MySQL 中常见的性能问题与优化建议

    MySQL 作为一款广泛应用于 Web 服务端的关系型数据库,性能问题一直是前端开发中的难点和瓶颈。以下是 MySQL 中常见的性能问题与优化建议,希望能给前端开发者一些启示和指导。

    1 年前
  • MongoDB 数据的导入与导出方法详解

    前言 MongoDB 是目前非常流行和热门的 NoSQL 数据库之一,它具有高效、易于扩展、灵活的数据模型等诸多优点。在实际的应用开发中,经常需要将数据从一个 MongoDB 实例导出,然后再导入到另...

    1 年前
  • 解决在 ECMAScript 2015 中的模板字符串问题

    前言 在 ECMAScript 2015 中,字符串模板成为了一个非常实用且常用的功能。我们可以使用字符串模板在字符串中插入变量或者表达式,而不用再使用字符串拼接的古老方法。

    1 年前

相关推荐

    暂无文章