使用 Node.js 和 JWT 实现用户认证和授权完整流程

在现代 Web 应用程序开发中,用户认证和授权是常见的需求。JWT(JSON Web Token)是一个使用 Node.js 等各种编程语言实现的开放标准,可以为 Web 应用程序实现安全的、可扩展的、无状态的用户认证和授权功能。

本篇文章将详细介绍使用 Node.js 和 JWT 所实现的用户认证和授权的完整流程,包括 JWT 原理、实现方法和最佳实践等。

JWT 简介

JSON Web Token(JWT)是一个开放的标准,定义了一种用于简洁、自包含的、安全地传输信息的方式。JWT 是在网络环境中传递声明的一种方式,主要用来在身份提供者和服务消费者之间传递认证信息。它可以被用来验证发送方声明的所有权或者声明的其他信息。

一个 JWT 由三部分组成:头部、载荷和签名。其中,头部和载荷都是 Base64 编码过的 JSON 对象,签名使用算法进行计算。JWT 可以以明文传输,但是建议使用 HTTPS 等安全通道传输。

头部中包含算法(默认为 HMAC SHA256)和 token 类型(默认为 JWT)等信息。载荷中包含需要传递的信息,比如用户 ID 和权限等。签名是由算法和头部、载荷中的数据计算得出的结果,主要用于验证数据的完整性和真实性。

在用户访问应用程序时,用户将会获得一个 JWT,之后在每个请求中都将该 JWT 发送给服务器。服务器将验证该 JWT 是否合法,然后允许用户访问相应资源。用户的 JWT 还可以在过期之前进行更新或者撤销。

使用 Node.js 和 JWT 实现用户认证和授权的完整流程

在本篇文章中,我们将使用 Express.js(Node.js 的常用框架)和 jsonwebtoken (JWT 的 Node.js 实现库)等工具来实现用户认证和授权的完整流程。

安装依赖

首先,我们需要通过以下命令安装必要的依赖:

--- ------- ------- ------------ ----------- -------- ------
  • Express.js:Web 应用程序框架
  • jsonwebtoken:JWT 的 Node.js 实现库
  • body-parser:解析请求体
  • bcryptjs:密码加密和验证
  • dotenv:从 .env 文件加载环境变量

创建配置文件

接下来,我们需要创建一个配置文件 .env,用于存储应用程序的配置信息,如数据库连接地址、JWT 密钥和过期时间等。

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

创建数据库模型

我们使用 MongoDB 作为我们的数据库,并创建 user.js 模型。

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

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

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

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

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

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

这个模型中包含用户的名字、电子邮件、密码和角色等信息。我们使用 bcryptjs 库来加密用户的密码,并将 matchPassword 函数用于比较用户的密码是否正确。

创建用户控制器

我们在 controllers/user.js 中创建一个用户控制器,用于处理用户的注册、登录和获取用户信息等请求。

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

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

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

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

我们在控制器中包含了创建用户、用户登录和获取用户信息的函数。其中, createUser() 函数用于创建一个新的用户, authUser() 函数用于验证用户的登录, getUser() 函数则用于获取已登录用户的信息。

创建 JWT 生成函数

我们需要创建一个函数,用于生成 JWT 来验证用户的身份。

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

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

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

这个函数中接受用户的 ID,使用 JWT 发行人和过期时间等信息生成一个 JWT,用于验证用户的身份。

创建身份验证中间件

我们在 middleware/authMiddleware.js 中创建一个身份验证中间件,用于验证用户是否已登录。

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

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

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

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

如果请求头中包含 Bearer Token,我们使用 JWT 验证身份。验证成功后,我们将已登录用户的 ID 添加到请求中,以便在后续的请求中使用。

创建路由

我们在 routes/userRoutes.js 中创建一个路由,用于处理用户的请求。

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

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

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

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

在路由中,我们使用控制器中定义的函数处理不同的请求。/register/login 用于创建用户和用户登录, /profile 用于获取已登录用户的信息,需要先验证用户的身份。

创建应用程序

最后,我们创建一个 server.js,用于创建我们的应用程序。

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

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

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

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

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

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

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

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

我们在应用程序中使用中间件 express.json() 来解析请求体,并使用路由 userRoutes 处理不同的请求。

总结

在这篇文章中,我们通过详细的示例代码,介绍了使用 Node.js 和 JWT 实现用户认证和授权的完整流程。JWT 是一种轻量级的身份验证和授权方式,它可以实现无状态的 Web 应用程序设计,当应用程序需要水平扩展时(如部署在多个服务器中),使用 JWT 可以更加方便地实现灵活的身份验证和授权。在实现用户认证和授权时,我们需要注意保护用户信息的安全性,选择合适的加密算法和过期时间等。

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


猜你喜欢

  • 使用 Custom Elements 构建复杂的 Web 应用程序界面

    简介 在构建复杂 Web 应用程序界面时,使用可重用的组件是必不可少的。可以通过使用 Custom Elements 来构建自定义组件,这是一种由 Web Components 规范定义的原生浏览器 ...

    1 年前
  • JavaScript 大神必不可少:ECMAScript 2019 全属性大解析

    JavaScript 大神必不可少:ECMAScript 2019 全属性大解析 JavaScript 始终是前端开发者最重要的技术之一,而 ECMAScript 是 JavaScript 标准化的文...

    1 年前
  • Tailwind CSS 如何使用特定的字体权重

    前言 Tailwind CSS 是一款实用的 CSS 框架,可以让前端开发人员更快速、便捷地构建自己的页面。本文主要介绍如何使用 Tailwind CSS 实现特定的字体权重,以达到不同页面展示效果。

    1 年前
  • Next.js 应用中集成 Google Analytics 的方法

    在现代 Web 应用程序中,Google Analytics 成为统计和分析网站数据最常用的工具之一。Next.js 是一个流行的 React 框架,可以使用预先渲染和服务器端渲染来提高应用程序的性能...

    1 年前
  • ES8中的新类型:BigInt

    在ES8规范中引入了一个新的数据类型:BigInt,该类型允许开发者处理大整数值,这些整数值超出了编程语言当前Number类型的最大限制。在本文中,我们将深入探讨BigInt类型的重要性、用法和示例代...

    1 年前
  • 在使用 Chai 的 expect 断言时遇到的坑点及解决方案

    在前端开发中,我们经常需要使用测试工具来保证代码的正确性。其中,Chai 是一个常用的断言库,它提供了一组易读、易编写的 API,可以方便地编写测试用例。在使用 Chai 的 expect 断言时,我...

    1 年前
  • Docker 容器快速搭建 Laravel 开发环境

    Laravel 是当下流行的 PHP Web 应用程序开发框架,它提供了许多优秀的特性和工具,可以大大提高开发效率和代码质量。而 Docker 则是目前最流行的容器化技术,可以将应用程序及其依赖项打包...

    1 年前
  • Vue.js 如何与 WebSocket 集成?

    WebSocket 是一种 HTML5 的协议,它在客户端与服务器之间建立了一个持久连接,可以实现实时通信,相比传统的 HTTP 请求响应通信方式,WebSocket 可以更快地将消息推送至客户端,降...

    1 年前
  • 学习 Node.js 需要掌握的基础知识和编程技能

    前言 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可让您在服务器端运行 JavaScript 代码。相较于传统的 PHP、Java 等语言,Node.js ...

    1 年前
  • React Redux 单元测试——使用 Enzyme 测试有状态组件

    在前端开发中,我们常常需要进行单元测试来确保代码的可靠性和稳定性,而 React Redux 的单元测试则是前端开发中的一个重要环节。在进行 React Redux 单元测试时,我们经常会用到 Enz...

    1 年前
  • 理解 ES7 的 Array.prototype.fill 方法

    ES7 引入了一个新的数组方法 Array.prototype.fill,可以用给定的值填充一个数组。本文将详细介绍它的用法和特性,以及一些示例代码和应用场景。 语法 arr.fill(value[,...

    1 年前
  • Flexbox 如何实现等高布局

    在前端开发中,布局一直是一个非常重要的问题。一般来讲,网页中的元素会随着内容的不同而高度不同,但是有时我们需要一些等高的布局,如何实现呢?本文将详细介绍如何使用 Flexbox 实现等高布局。

    1 年前
  • Mongoose + MongoDB 数据库操作:遇到的问题和解决方法

    前言 Mongoose 是 Node.js 中使用最广泛的 MongoDB 数据库插件,它提供了一种面向对象的数据建模方式和一组接口操作 MongoDB。它的出现极大的简化了对 MongoDB 数据库...

    1 年前
  • Koa2 基础教程:如何使用 koa-passport 实现用户认证

    什么是 Koa2 Koa2 是一个基于 Node.js 平台的下一代 web 开发框架,是 Express 的一种更轻量、更易扩展的设计方案。Koa2 使用异步函数,自己不绑定任何中间件,仅仅完成最核...

    1 年前
  • 巧用 LESS 预处理器实现响应式布局

    在如今的互联网时代,响应式布局已经成为了面向多个设备的标准解决方案。但是在实际的开发过程中,如何实现一个具有完美响应式效果的页面却是不容易的。LESS 作为一种 CSS 预处理器,可以帮助我们实现更为...

    1 年前
  • 如何使用 Angular 和 Bootstrap 创建响应式布局

    在当前的 Web 应用程序设计中,响应式布局变得越来越重要,因为现代用户不仅使用电脑打开网站,还使用移动设备,如智能手机和平板电脑。使用响应式布局可以确保您的网站在不同的设备上都有良好的用户体验。

    1 年前
  • 如何在 Node.js 中实现 RESTful API

    Node.js是一个非常流行的JavaScript运行环境,它使得开发者能够在后端使用JavaScript编写代码,包括实现RESTful API。RESTful API已经成为现代Web应用程序的基...

    1 年前
  • SASS 中的 mixin 编写规范与技巧分享

    随着前端开发技术的不断进步,前端开发工程师们不再满足于基本的 CSS 样式写法。SASS(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,通过 SASS...

    1 年前
  • RxJS 中的操作符 concat 和 merge,你真的了解吗?

    RxJS 是一种用于对异步数据流进行编排和处理的库。它基于观察者模式,可以将我们的应用程序分解为多个可观察的数据源,这些数据源可以与我们的应用程序解耦并方便地进行组合和转换。

    1 年前
  • Babel-plugin-react-css-modules 的使用方法

    在现代Web开发中,使用 CSS 样式表是不可避免的。然而,由于 CSS 具有全局作用域,很容易导致样式冲突和混杂。这时,React CSS Modules 就能为我们提供一种解决方案。

    1 年前

相关推荐

    暂无文章