Express.js 中使用 Passport.js 进行身份验证

在 Web 应用程序中,身份验证是一个非常重要的安全性问题。通过身份验证,应用程序能够确认用户的身份并授权其访问特定资源。在 Node.js 的 Web 应用程序开发中,常常使用 Express.js 作为 Web 框架。而 Passport.js 是一个 Node.js 的身份验证中间件,它能够快速、灵活地为 Express 应用程序添加身份验证功能。

本文将详细介绍在 Express.js 中使用 Passport.js 进行身份验证的步骤。

安装和配置

首先,需要安装 Express.js 和 Passport.js:

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

Passport.js 提供了多个身份验证策略(Authentication Strategies),其中最常用的是本地策略。本地策略(Local Strategy)使用用户名和密码进行身份验证,我们还需要安装一个密码加密库,如 bcrypt:

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

在 Express.js 应用程序中,需要配置 Passport.js 中间件。可以编写一个文件来完成此项工作,例如 config/passport.js

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

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

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

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

在上述代码中,我们定义了一个本地身份验证策略,并实现了 serializeUserdeserializeUser 钩子函数。serializeUser 函数将用户对象序列化为标识符,而 deserializeUser 函数接受用户标识符并将其反序列化为用户对象。

身份验证路由

有了身份验证中间件之后,我们需要在 Express.js 应用程序中设置路由来处理用户的登录请求。这个路由应该是一个 POST 请求,并且由 Passport.js 中间件来处理身份验证。

例如,假设登录表单具有 usernamepassword 两个字段,我们可以这样来处理:

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

在上述代码中,当 POST /login 路由被调用时,会执行 Passport.js 中间件进行身份验证。如果身份验证成功,用户将被重定向到路径 /,否则用户将被重定向到路径 /login 并显示一条错误消息。

登录信息持久化

默认情况下,Passport.js 不会将用户信息保存在会话中。这意味着每个请求都需要重新进行身份验证。为了方便起见,可以配置 Passport.js 来支持登录信息的持久化。

通常,将用户 ID 存储在会话中是实现登录信息持久化的一种常见方法。在 PASSPORT 中,可以使用 passport.serializeUserpassport.deserializeUser 钩子函数来实现此目的。

可以在 Express.js 中通过以下代码段来配置持久化支持:

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

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

在上述代码中,我们将 Express.js 的会话中间件与 Passport.js 集成,以便支持身份验证信息的持久化。

示例代码

下面是完整的 Express.js 和 passport.js 示例代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

在本文中,我们介绍了在 Express.js 中使用 Passport.js 进行身份验证的基本步骤。我们配置了 Passport.js 来使用本地身份验证策略,并处理了登录请求的路由。我们还演示了如何将用户信息保存在会话中以支持登录信息的持久化。

Passport.js 不仅支持本地身份验证策略,还支持其他身份验证策略,如 OAuth 和 OpenID。通过阅读官方文档和示例,你可以更深入地了解 Passport.js 的各种用法,并将其应用到你的 Node.js Web 应用程序中来增强其安全性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66422eb7d3423812e4023ebb