Node.js + Mongoose + Express + MongoDB,实现用户认证系统

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

简介

随着互联网的快速发展,各种类型的网站和应用层出不穷。用户认证系统是一种关键的安全功能,它可以确保只有合法用户才能访问您的网站和应用。

在这篇文章中,我们将探讨如何使用 Node.js, Mongoose, Express 和 MongoDB 来构建一个可靠的用户认证系统。我们将会详细介绍这个系统所需的每个组件,包括用户模型、身份验证过程、用户注册和登陆,以及用户认证所涉及的其他方面,如密码重置、电子邮件确认等。

技术栈

在开始之前,让我们简单了解一下我们将使用的技术栈:

  • Node.js: 在服务器端运行 JavaScript 代码的运行时环境。
  • Express: 基于 Node.js 的 Web 框架,提供了丰富的 API 以及易于构建 Web 应用的工具。
  • MongoDB: 非关系型数据库,我们将用它来存储我们的用户数据。
  • Mongoose: 一个用于 MongoDB 的优雅的对象建模框架,提供了一个简单的、可重用的方案来构建应用程序和 API。

用户模型

首先,我们需要定义用户模型来存储我们的用户数据。我们将使用 Mongoose 来定义这个模型。用户模型应该包含以下字段:

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

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

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

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

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

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

注册和登录

接下来,我们需要为我们的用户提供注册和登录的功能。对于注册,我们需要允许用户提供姓名、电子邮件和密码,并保证电子邮件地址的唯一性。

对于登录,我们需要验证用户的身份并颁发一个 JSON Web Token(JWT),以便其将来在 Web 应用程序中维护登录状态。我们将使用 Passport.js 作为我们的身份验证中间件。Passport 提供了一个易于配置和灵活的身份验证系统,支持多种身份验证策略和插件,而且已经成为了 Node.js 开发人员的标准身份验证解决方案之一。

我们首先需要安装 Passport.js 和一些额外的库来支持它与 MongoDB 以及 JWT 之间的交互。

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

接下来,让我们创建一个基本的 Express 应用程序,并使用 Passport 提供的本地验证策略来定义我们的登录路由。我们需要将用户名和密码作为 POST 请求的一部分发送到服务器。

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

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

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

在上面的代码中,我们使用本地策略来验证用户的电子邮件和密码,并在验证通过时颁发 JWT。passport.authenticate() 函数由 Express 的路由处理程序调用,并将验证结果返回到回调函数中。如果验证失败,则向用户发送一个 401 错误。

我们还可以添加一个注册路由,以便用户能够在我们的系统中注册账户。以下是一个基本的路由示例:

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

在上面的代码中,我们使用 Mongoose 的 .create() 方法来创建一个新的用户条目,并在成功创建用户时颁发 JWT。

密码重置

最后,我们需要为我们的用户提供密码重置的功能。当用户忘记密码时,他们应该能够通过输入其注册的电子邮件地址来接收一个包含密码重置链接的电子邮件。当他们单击重置链接时,我们将指向我们的服务器 API,该 API 将验证令牌,并允许他们输入新密码。

首先,我们需要添加两个新的路由,一个用于处理忘记密码电子邮件请求,另一个用于重置密码并返回一个 JWT:

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

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

在上面的代码中,我们使用 async.waterfall() 函数来执行一系列的回调函数。第一个函数生成一个密码重置令牌,第二个函数将令牌与用户数据关联,并向用户发送包含密码重置链接的电子邮件。当用户单击重置链接时,路由处理程序将验证令牌并允许用户输入新密码。

结论

这篇文章涵盖了如何使用 Node.js, Mongoose, Express 和 MongoDB 来构建一个全面的用户认证系统。我们了解了如何定义用户模型、如何实现注册和登录功能,以及如何允许用户重置他们的密码。

值得注意的是,这只是一个入门级别的示例,还有很多改进的地方和更多的细节需要注意。但我们的代码可以作为您自己应用程序的基础,并可以根据需要进行修改。

我们希望本文对您有所帮助,让您能够创建一个完整的用户认证系统来保护您的 Web 应用程序。

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


猜你喜欢

  • Kubernetes 面对庞大性能负载时的解决办法

    引言 在现代化的互联网时代,性能负载是一个非常棘手的问题。随着用户量的增长以及业务发展,庞大的性能负载会导致系统的崩溃和性能下降。针对这个问题,Kubernetes 提供了一系列的解决办法解决庞大性能...

    15 天前
  • 使用 Node.js 进行消息队列操作

    在现代 Web 应用程序中,处理异步操作是至关重要的。为了解决这个问题,使用消息队列是一种常见的方式,用于协调和处理来自不同来源的任务。在这篇文章中,我们将了解 Node.js 中的消息队列和如何使用...

    15 天前
  • CSS Reset 的实现方式对 SEO 的影响

    CSS Reset 是一种常用的前端开发技术,旨在消除不同浏览器的默认样式,从而使网页在各种浏览器中呈现出更加一致的外观和布局。然而,CSS Reset 的实现方式对搜索引擎优化(SEO)也有一定的影...

    15 天前
  • 在 Fastify 中使用 MongoDB 数据库的完整指南

    在现代的 Web 开发中,数据库是每一个应用的基础。MongoDB 作为一个非常流行的 NoSQL 数据库,极大地简化了数据存取的流程。同时,Fastify 也是一个快速、低开销的 Web 服务器,是...

    15 天前
  • 发现 LESS Bug:如何在 Github 中提交问题报告

    最近我在使用 LESS 工具时发现一个 bug,这个 bug 让我非常困扰。于是我决定向 LESS 的开发者提交一个问题报告。在这个过程中,我学习到了如何提交问题报告,希望我的经验能够对遇到类似问题的...

    15 天前
  • Express.js 和 Elasticsearch,如何实现全文搜索

    在现代 web 应用程序中,全文搜索是不可或缺的功能之一。Express.js 是一个流行的 web 框架,而 Elasticsearch 则是一个广泛用于全文搜索的分布式搜索引擎。

    15 天前
  • Mocha 测试框架中如何运行只有在特定条件下才运行的测试用例

    Mocha 是一个流行的前端测试框架,可以用于编写测试代码并运行测试套件。在编写测试用例时,有时候我们需要只在特定条件下运行一些测试用例,比如只在特定环境或者特定浏览器下运行,这时候怎么做呢? 本篇文...

    15 天前
  • SPA 应用的 SEO 和 SEM 如何优化?

    随着现代 Web 应用程序的流行,SPA(Single Page Application)成为了一种非常受欢迎的 Web 应用程序类型,因为它们提供了更好的用户体验和交互性。

    15 天前
  • React+Redux 整体解决方案介绍

    在前端开发中,React 和 Redux 是非常常用的框架。React 作为一个解决方案,用于构建大型、高性能的 Web 应用程序。而 Redux 可以帮助我们管理 JavaScript 应用程序的状...

    15 天前
  • 解决 ES9 中 Array.prototype.sort 排序问题

    在 ES9 中,Array.prototype.sort 方法将使用一个新的排序算法,该算法具有更好的平均性能和更好的稳定性。然而,这个新算法可能会导致某些应用程序中的不兼容性问题。

    15 天前
  • 使用 Cypress 组件进行 UI 测试

    Cypress 是一个流行的前端测试框架,可以方便地进行端到端的测试,包括 UI 测试、API 测试等。在进行 UI 测试时,Cypress 提供了一些内置的组件可以帮助我们快速编写测试用例。

    15 天前
  • Angular 中如何制作可复用的组件

    Angular 是一个流行的前端框架,允许开发人员使用组件化思维来构建 Web 应用程序。组件是应用程序中的核心部分,它们允许我们将 UI 分解成小部件并使其可重用。

    15 天前
  • MongoDB 的模型层工具 Mongoose 的用法介绍

    MongoDB 的模型层工具 Mongoose 的用法介绍 什么是 MongoDB MongoDB 是一款非常流行的 NoSQL 数据库,它的出现在很大程度上解决了传统关系型数据库无法解决的问题,如扩...

    15 天前
  • GraphQL 中如何处理多嵌套对象的数据查询

    GraphQL 是一种用于构建 API 的开源数据查询和操作语言。相比于 RESTful API,它具有更高的灵活性和可扩展性。在实际开发中,我们通常需要查询包含多个嵌套对象的数据。

    15 天前
  • 解析 Web Components 在 Vue 中的使用及注意事项

    Web Components 是一种基于现代 Web 技术的组件化开发方式,它可以让我们在不同的前端框架中进行组件的共享和复用。在 Vue 中使用 Web Component,可以让我们更好的利用已有...

    15 天前
  • ESLint 报错:Parsing error: 'x' is already defined

    ESLint是前端开发中非常常用的代码规范检测工具。它能够帮助我们检测代码中潜在的问题,并提示出来。虽然ESLint能够帮助我们排除一些代码中的问题,但它有时候也会发出错误信息,如Parsing er...

    15 天前
  • ES10 中的 String.trim() 方法使用技巧及为何使用它们

    在 ES10 中,String 类型新增了 String.trim() 方法。该方法可以去掉字符串开头和结尾的空格,返回去除空格后的新字符串。本文将详细介绍该方法的使用技巧、为何使用它们以及示例代码。

    15 天前
  • TypeScript 中的类型注解与类型推断的区别

    在前端开发中,TypeScript 已成为越来越受欢迎的语言。TypeScript 是 JavaScript 的一个超集,可以在其基础上添加类型注解等特性,以提高代码的可读性和可维护性。

    15 天前
  • Next.js 自定义配置文件完全指南

    Next.js 是一款流行的 React 服务器端渲染框架,它提供了非常便利的默认配置,使得我们可以快速地搭建网站。然而,在某些情况下,我们可能需要进行一些自定义配置以满足特定需求。

    15 天前
  • 解决 Angular 中 RouterModule.forRoot() 引起的多次加载 Bug

    背景 在使用 Angular 框架进行开发的过程中,我们经常会用到 RouterModule 模块来完成路由的配置。在配置项目的路由时,我们通常会使用 RouterModule.forRoot() 方...

    15 天前

相关推荐

    暂无文章