使用 Express.js 和 Passport 实现身份验证的完整教程

阅读时长 8 分钟读完

简介

在现代 Web 应用程序中,身份验证是一个非常重要的功能。Express.js 是一个流行的 Node.js Web 框架,而 Passport 是一个可扩展的身份验证库,可以轻松地与 Express 集成。在本文中,我们将深入了解如何使用 Express.js 和 Passport 实现身份验证功能。

准备工作

在开始之前,需要确保已经安装了 Node.js 和 npm。如果没有安装,请先从官网下载并安装。

然后,我们需要创建一个新的 Express.js 应用程序。打开终端并执行以下命令:

接下来,在 myapp 文件夹中创建一个新的文件 index.js,并添加以下代码:

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

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

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

现在,我们已经有了一个简单的 Express.js 应用程序,它将在 http://localhost:3000 上监听请求并响应 "Hello World!"。

安装 Passport

接下来,我们需要安装 Passport。打开终端并执行以下命令:

这将安装 Passport 及其本地策略。

实现身份验证

现在,我们可以开始实现身份验证了。我们将使用 Passport 的本地策略来验证用户的用户名和密码。在 index.js 中添加以下代码:

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

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

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

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

首先,我们导入了 Passport 和本地策略。然后,我们使用 passport.use() 方法来定义一个本地策略。本地策略需要一个验证函数,该函数将接收用户名和密码,并在验证成功时调用 done(null, user),其中 user 是一个包含用户信息的对象。在验证失败时,调用 done(null, false)

接下来,我们使用 passport.initialize() 中间件来初始化 Passport。最后,我们定义了一个 /login 路由,并使用 passport.authenticate() 方法来验证用户名和密码。如果验证成功,将继续执行路由处理程序并响应 "Logged in successfully"。

现在,我们已经可以使用本地策略实现身份验证了。但是,每次请求都需要手动调用 passport.authenticate(),这很麻烦。接下来,我们将使用 Passport 的序列化和反序列化功能来实现持久化登录状态。

实现持久化登录状态

为了实现持久化登录状态,我们需要在 Passport 中定义序列化和反序列化函数。在 index.js 中添加以下代码:

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

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

首先,我们使用 passport.serializeUser() 方法来定义一个序列化函数。序列化函数将接收一个用户对象,并将其转换为一个唯一的标识符,以便将其存储在会话中。在这里,我们将使用用户名作为唯一标识符。

接下来,我们使用 passport.deserializeUser() 方法来定义一个反序列化函数。反序列化函数将接收一个唯一标识符,并将其转换回用户对象。在这里,我们检查用户名是否为 "admin",如果是,则返回一个包含用户名的对象,否则抛出一个错误。

现在,我们已经定义了序列化和反序列化函数。接下来,我们需要在 Express.js 应用程序中启用会话支持。在 index.js 中添加以下代码:

这将启用会话支持,并使用 "mysecret" 作为加密密钥。resavesaveUninitialized 选项设置为 false,以确保不会在每个请求上重新保存会话。

现在,我们已经启用了会话支持,并定义了序列化和反序列化函数。接下来,我们需要更新 /login 路由以启用持久化登录状态。在 index.js 中添加以下代码:

在验证成功后,我们将用户对象存储在会话中。这将使用户在下一次请求时自动登录。现在,我们已经成功实现了持久化登录状态。

完整代码

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

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

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

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

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

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

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

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

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

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

结论

在本文中,我们深入了解了如何使用 Express.js 和 Passport 实现身份验证功能。我们学习了如何使用 Passport 的本地策略、序列化和反序列化函数以及持久化登录状态。这些知识对于实现现代 Web 应用程序中的身份验证功能非常重要。希望本文对你有所帮助!

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

纠错
反馈