使用 Passport.js 和 Express.js 实现用户认证功能

阅读时长 10 分钟读完

在现代 Web 开发中,用户认证是一个非常常见的需求。 Passport.js 是一个优秀的认证中间件,能够与 Express.js 等 Web 框架无缝集成,方便地实现用户认证功能。

本文将介绍如何使用 Passport.js 和 Express.js 实现用户认证功能。我们将会讲解基本的身份认证和授权概念,介绍 Passport.js 的工作原理和使用方法,并提供详细的示例代码。

身份认证和授权概念

在开始使用 Passport.js 和 Express.js 实现用户认证功能之前,我们需要先理解一些基本的身份认证和授权概念。

身份认证是确认用户身份的过程。在 Web 应用中,通常需要用户提供用户名和密码来进行身份认证。认证过程的结果通常是一个令牌或者 session,用于标识已认证的用户。

授权是确定用户是否有权限进行某个操作的过程。在 Web 应用中,通常使用角色或者权限来控制用户访问的资源和执行的操作。用户是否有权限进行某个操作通常通过令牌或者 session 进行识别。

Passport.js 工作原理

Passport.js 是一个认证中间件,可以方便地集成到 Express.js 等 Web 应用框架中。Passport.js 将认证和授权的逻辑进行了封装,使用者只需要编写一些策略(Strategy),并将它们传递给 Passport.js,即可实现用户认证功能。

Passport.js 支持多种不同的认证策略,例如本地认证(username/password)、OAuth、OpenID 等。通过使用多个策略组合,Passport.js 可以满足不同 Web 应用的需求。我们可以根据需要选择合适的策略来实现用户认证功能。

下面我们将使用 Passport.js 和 Express.js 来实现一个简单的用户认证功能。我们将使用本地认证策略,即通过用户名和密码来认证用户。

安装 Passport.js 和相关依赖

要使用 Passport.js,我们需要先安装相关依赖。在命令行中执行以下命令:

  • passport 是 Passport.js 模块;
  • passport-local 是本地认证策略模块;
  • express-session 是一个用于管理 session 的模块。

编写认证策略

我们需要编写一个本地认证策略来实现用户名和密码的认证。在代码中,我们将用户名和密码直接保存在一个数组中。这只是一个示例代码,在实际应用中,我们应该将用户信息存储在数据库中。

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

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

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

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

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

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

我们首先引入了 Passport.js 和 passport-local 模块。然后,我们定义了一个保存用户信息的数组。接着,我们使用 passport.use() 方法来定义一个本地认证策略。在这个策略中,我们通过 users.find() 方法查找到相应的用户信息。如果用户不存在,我们将调用 done() 方法并返回错误信息;如果密码不正确,我们也将返回错误信息。如果用户名和密码都正确,我们将用户信息传递给 done() 方法作为第二个参数。这个用户信息将会在后续的代码中用到。

配置 Express.js 应用

为了使用 Passport.js,我们需要配置 Express.js 应用。我们需要引入相关模块,并配置相应的中间件。

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

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

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

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

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

这里我们引入了 Express.js、express-session 和 Passport.js 模块。我们还使用了 express.urlencoded()express.json() 中间件以便能够解析 POST 请求和 JSON 格式的请求数据。

然后,我们使用 session() 方法来定义 session 的参数。在这里,我们使用了一个字符串作为 secret,这个字符串需要被替换为一个随机的字符串。resave: falsesaveUninitialized: false 参数表示我们不希望在每一个请求中都重新保存 session,以避免不必要的 I/O 操作。

接着,我们使用 passport.initialize()passport.session() 中间件来序列化和反序列化 session 中的用户信息,以便 Passport.js 能够进行身份认证和授权。

编写路由和控制器

我们需要编写路由和控制器来处理用户认证和授权。在示例代码中,我们将 /login/logout 作为登录和登出的路由。

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

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

在这里,我们使用 passport.authenticate() 中间件来进行身份认证。这个中间件会时候调用我们之前定义的本地认证策略。如果认证成功,我们将会调用后面的控制器。如果认证失败,passport.authenticate() 中间件会自动返回适当的错误信息。

对于 /logout 路由,我们只需要调用 req.logout() 方法并返回 JSON 格式的响应。

完整代码

下面是完整的示例代码。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

使用 Passport.js 和 Express.js 可以很方便地实现用户认证功能。我们可以通过编写多个认证策略来适应不同的 Web 应用需求。

需要注意的是,我们应该遵循最佳实践并将用户信息存储在数据库中,而不是像本文中示例代码一样将用户信息保存在一个数组中。

希望本文能帮助读者理解使用 Passport.js 和 Express.js 实现用户认证功能的基本原理和方法。

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

纠错
反馈