如何使用 Express.js 和 MongoDB 进行身份验证

阅读时长 16 分钟读完

本文将向您介绍如何使用 Express.js 和 MongoDB 进行身份验证。我们将探讨如何使用 Express.js 中间件和 MongoDB 数据库来创建基本的身份验证系统。本文旨在为初学者提供一个入门指南,但同时也提供深入洞察的内容和建议。

简介

身份验证是感知和验证用户的一种方法,以确认他们是否拥有访问应用程序的权限。HTTP 基本身份验证不足以保护对敏感资源的访问。因此,更何况在大多数应用中,身份验证和授权都是不可或缺的组成部分。

MongoDB

MongoDB 是一种面向文档的数据存储解决方案,它使用平面文档 JSON 格式,而不是使用关系型表。这使得存储数据变得更加简单,因为我们不必考虑复杂的关系。这使得它成为身份验证的理想选择。

Express.js

Express.js 是一个开发 Web 应用程序的 Node.js 框架。它提供了一个简单易用的 API,用于编写 HTTP API、Web 应用程序和其他基于 HTTP 协议的网络服务。

步骤

在开始之前,请确保您已安装 Node.js 和 MongoDB。我们将按下面的步骤进行身份验证设置。

步骤 1:使用 Node.js 和 Express.js 初始化应用程序

我们要使用 Express.js 创建一个 Node.js 应用程序。首先,启动终端并运行以下命令:

这将初始化一个新的 Node.js 应用程序,并在 package.json 中创建一个基本的配置。

现在,我们要安装依赖项 Express.js、Body-parser、运行 npm install 命令:

创建 app.js 文件并添加以下代码:

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

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

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

---------------- -- -- -
  ------------------- -- -- --- ------- -- ---- -------
---
展开代码

上面的代码创建了一个 Express.js 应用程序,并将其联接到 3000 端口。它还定义了一个测试路线,可以快速检查应用程序是否正在运行。

使用以下命令在浏览器中打开 http://localhost:3000,以确保应用程序正在运行:

如果一切正常,当您访问拥有/根目录时,您应该看到 "Hello World!" 。

步骤 2:建立 MongoDB 数据库

为了存储用户的身份验证数据,我们要在 MongoDB 中建立专用数据库。首先,启动 MongoDB 服务器,然后使用 shell 连接到 MongoDB。

第一次运行 MongoDB 服务器时,数据库可能不会连接并启动。如果这是您首次使用 MongoDB,请使用以下命令将数据目录设置为 ~/data/db :

然后,启动 mongod 服务器:

另外,打开新终端,使用以下命令连接到 MongoDB:

现在,我们要创建一个名为 node-auth 的新数据库。在连接到 MongoDB 后,运行以下命令:

然后,创建一个名为 "users" 的集合,该集合将用于存储有关用户的信息:

步骤 3:添加身份验证路由

添加路由,该路由可用于进行新用户注册和现有者登录。我们将使用 POST 请求来执行这些操作,因为我们只想使用 POST 请求来发送敏感的信息(如密码等)。

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

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

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

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

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

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

  -------------- ------------ --- ---- ------ ------
---
展开代码

上面的代码添加了 /signup 和 /login 路由,以便注册和登录新用户。当发送 POST 请求时,我们会将新数据添加到 users 数组中。给定电子邮件地址的用户将被识别并授权访问应用程序。

步骤 4:将身份验证信息存储在 MongoDB 中

现在,我们将使用 MongoDB 扩展上述代码来存储有关用户的信息。我们将使用 MongoDB 作为唯一的身份验证系统,而不是只使用内存中的数组。

首先,我们要获取 MongoDB 驱动程序:

添加以下代码来创建 MongoDB 数据库连接:

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

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

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

  ---------------
---
展开代码

这将创建连接到我们的 MongoDB 数据库的连接。

现在,我们要更新我们的 /signup 和 /login 路由,以使用 MongoDB 的 users 集合。

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

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

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

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

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

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

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

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

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

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

    -------------- ------------ --- ---- ------ ------
  ---
---
展开代码

如上所述,我们将使用 MongoDB 的 users 集合代替内存数组。我们还添加了一个新的查询 findOne 来查找具有给定电子邮件地址的用户。如果用户已保存在数据库中,则向客户端发送状态 409。对于新用户,我们将使用 insertOne 来将新数据插入到 users 集合中。

对于登录操作,我们使用 findOne 从数据库中查找给定电子邮件地址的用户。如果该用户不在数据库中或密码不匹配,则向客户端发送状态 401(无授权)。

步骤 5:使用 JSON Web Token 进行身份验证

现在,我们在 MongoDB 中存储用户数据,并已使用 /signup 和 /login 路由进行身份验证。最后一步是专业化身份验证方法,以在会话期间保持身份。我们引入 JSON Web Tokens 来完成此操作。

我们要使用 jsonwebtoken npm 包来添加 JWT 机制。运行以下命令以将其安装为依赖项:

让我们现在更新我们的 /login 路由,以生成 JWT 并将其回传。

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

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

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

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

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

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

    ----------
      -----
      ------
    ---
  ---
---
展开代码

如上所述,我们在调用 jwt.sign 方法时将用户数据传递给其参数。第二个参数是用于生成签名的密钥,应从环境变量中提取。第三个参数是 token 的有效期。在上面的示例中,令牌将在 1 天后过期。

令牌已生成并作为响应的一部分发回客户端。客户端应存储令牌,并在随后的每个请求中将其添加到请求标头中。

步骤 6:验证 JWT

最后一步是验证 JWT。我们将编写一个中间件方法,用于检查请求的身份验证标头,并检查令牌的有效性。

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

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

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

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

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

-- ---- -----
---------------- ------------- ----- ---- -- -
  ------------- ---- ----- ---------------- -- -----------------
---
展开代码

如上所述,我们先使用 authenticate 中间件来验证身份验证标头。中间件使用 req.headers.authorization 来获取身份验证标头,格式为 “Bearer [TOKEN]”。

如果找不到身份验证标头,则会向客户端发送 401 状态。如果找到,则会从标头中提取令牌(注意,这里我们使用 split 分割 bearer 和 token 字符串)。

最后,我们使用 jwt.verify 方法来验证令牌并将 decoded 对象附加到 req 上。decoded 对象包含有关用户的信息,如 ID、电子邮件地址和密码。

步骤 7:结束

现在让我们更新 app.js 以添加 auth 中间件路由

然后,运行您的程序进行身份验证。 通过 POST 请求进行身份验证并检查生成的JWT。将其用于下一步操作之一,并通过 /auth 路由验证 JWT 是否有效。

实例代码

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

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

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

--- -------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

---------------- -- -- -
  ------------------- -- -- --- ------- -- ---- -------
---
展开代码

结论

在本文中,我们演示了如何使用 Express.js 和 MongoDB 创建基本的身份验证系统。我们使用 /signup 和 /login 路由来注册新用户和登录现有用户,并使用 MongoDB 的 users 集合进行持久化存储。最后,我们设置了 JSON Web Tokens,并使用 authenticate 中间件验证 JWT 的有效性。

除了上述方法之外,还有许多其他方法可供选择。例如,您可以使用 Passport.js 或使用 JSON Web Tokens 的其他实现。无论如何,从根本上了解身份验证是很重要的,因为身份验证是面向任何 Web 应用程序(尤其是对于那些处理敏感信息)的目标。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6771270e6d66e0f9aacc2b0a

纠错
反馈

纠错反馈