如何在 Express.js 中使用 Passport 进行用户认证

阅读时长 14 分钟读完

在开发 Web 应用程序时,我们通常需要一个用于用户认证的机制。Passport 是一个开源的用户认证工具,可以轻松地在 Node.js 应用程序中集成各种身份验证策略。在这篇文章中,我们将介绍如何在 Express.js 中使用 Passport 进行用户认证。

准备工作

在开始之前,我们需要确保已经安装了 Node.js,可以使用 npm 安装以下依赖项:

  1. express:用于创建 Web 应用程序的框架

  2. passport:使用它可以在 Node.js 应用程序中集成各种身份验证策略

  3. passport-local:用于使用用户名和密码进行身份验证的 Passport 策略

  4. mongoose:用于连接 MongoDB 数据库和进行数据建模的工具

  5. bcrypt:用于将密码哈希的 Node.js 模块

安装命令如下:

创建应用程序

接下来,我们将创建一个 Express.js 应用程序,包括以下文件:

  1. server.js 文件:服务端代码,启动服务器并配置路由

  2. passport-config.js 文件:配置我们的 Passport 身份验证策略

  3. user.js 文件:定义数据库模式来保存用户信息

server.js 文件

首先,我们将在 server.js 文件中定义基本的应用程序设置和路由。首先,我们必须对这些依赖项进行引用:

我们需要启用会话支持和中间件,以便 Passport 可以正常工作。我们将使用以下中间件:

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

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

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

这里,我们正在将身份验证中间件添加到应用程序中。其中,secret 属性用于设置会话密码,resavesaveUninitialized 用于在会话中保存请求的数据。

接下来,我们将引用路由并启动服务器:

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

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

在这里,我们为 authRoutes 定义了一个路由前缀,表示我们的身份验证路由将是 http://localhost:3000/auth。在 authRoutes 中,我们将定义用户的注册、登录和注销路由,并且在 passport-config.js 文件中定义身份验证策略。

passport-config.js 文件

接下来,让我们在 passport-config.js 文件中定义我们的身份验证策略。

首先,我们需要引用必要的依赖项:

接下来,我们将使用 Passport 的本地策略(即用户名和密码)来验证用户的身份。我们将执行以下步骤:

  1. 认证过程:我们将通过本地策略验证用户的身份,并为其提供应用程序访问权限。

  2. 用户序列化:Passport 将使用序列化和反序列化功能来为已登录用户的存储会话。

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

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

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

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

在这里,我们正在将本地策略添加到 Passport 中,使用 User.findOne 方法查找指定用户名的用户,然后使用 bcrypt 库与存储在数据库中的哈希密码进行比较。如果匹配成功,则 Passport 将用户传递到 done 方法作为已通过身份验证的用户。

接下来,我们使用 serializeUserdeserializeUser 方法定义如何将已登录用户存储在会话中。serializeUser 方法将已登录用户的 id 存储在 Passport 存储中,而 deserializeUser 方法将此 id 用于恢复用户对象。

user.js 文件

最后,我们需要定义数据库模式来保存用户信息。

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

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

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

注册、登录和注销

现在,我们已经设置了基本的应用程序和身份验证策略,让我们来看看如何使用 Passport 在 Express.js 中进行用户身份验证。

注册

当用户要注册新账户时,他们将访问 /auth/register 路由。在路由中,我们将使用 bcrypt 库将密码哈希,并将其保存在数据库中。

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

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

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

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

在这里,我们使用 bcrypt 库对密码进行哈希处理,使用 User 模型将打包并保存用户数据,会在成功保存用户后重定向到应用程序的主页中。

登录

在用户输入了正确的用户名和密码之后,它们将访问 /auth/login 路由来进行身份验证。在这里,我们将使用 passport.authenticate 方法来验证用户的用户名和密码是否正确。如果匹配成功,则用户将被重定向到 / 路由,即应用程序的主页。否则,他们将被重定向到 /auth/login 路由。

注销

最后,让我们来看看如何使用 Passport 注销用户。这里我们简单地使用 req.logout 方法将其从会话中清除。

结论

在此示例中,我们使用了 Passport 本地策略来验证用户的用户名和密码。Passport 支持多种身份验证策略,如 OAuth、OpenID 等。Passport 使用户身份验证非常简单,以便您可以专注于更加深入的 Web 应用程序开发。

完整代码如下:

server.js 文件

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

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

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

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

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

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

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

passport-config.js 文件

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

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

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

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

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

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

user.js 文件

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

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

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

authRoutes.js 文件

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

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

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

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

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

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

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

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

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

纠错
反馈