手把手教你在 Express.js 中使用 Passport.js 进行身份验证

阅读时长 10 分钟读完

身份验证是 Web 应用程序中最常见的功能之一。在 Express.js 中,我们可以使用 Passport.js 库来实现身份验证。Passport.js 是一个非常流行的 Node.js 库,它提供了一种简单的方式来实现身份验证和授权。在本文中,我们将介绍如何在 Express.js 中使用 Passport.js 进行身份验证。

安装 Passport.js

在开始之前,我们需要先安装 Passport.js。在命令行中运行以下命令:

Passport.js 依赖于 passport-local 模块,因此我们需要同时安装它们两个。

创建 Express.js 应用程序

在开始使用 Passport.js 进行身份验证之前,我们需要先创建一个 Express.js 应用程序。我们可以使用 Express 应用程序生成器来创建一个基本的 Express.js 应用程序。在命令行中运行以下命令:

这将创建一个名为 myapp 的新项目。我们可以进入该目录并安装依赖项:

现在,我们已经创建了一个基本的 Express.js 应用程序,并准备好开始使用 Passport.js 进行身份验证。

配置 Passport.js

在使用 Passport.js 进行身份验证之前,我们需要先配置它。我们需要在 app.js 文件中添加以下代码:

在这段代码中,我们首先引入了 Passport.js 和 passport-local 模块。然后,我们使用 LocalStrategy 对象创建了一个新的策略。LocalStrategy 对象是 Passport.js 中的一种策略,它用于验证本地用户名和密码。在 LocalStrategy 构造函数中,我们传递了一个回调函数,该函数将用于验证用户的用户名和密码。

现在,我们需要实现验证回调函数。在回调函数中,我们将使用数据库或其他存储介质来验证用户的用户名和密码。如果验证成功,我们将通过调用 done() 方法来指示 Passport.js 验证成功。如果验证失败,我们将通过调用 done() 方法来指示 Passport.js 验证失败。

实现身份验证路由

现在,我们已经配置了 Passport.js,我们可以开始实现身份验证路由。我们将使用 Express.js 中的路由来处理身份验证请求。在 app.js 文件中添加以下代码:

在这段代码中,我们首先定义了一个 POST 路由,该路由用于处理身份验证请求。我们使用 passport.authenticate() 方法来验证用户的用户名和密码。如果验证失败,我们将重定向到 /login 路由。如果验证成功,我们将重定向到主页。

实现登录页面

现在,我们已经实现了身份验证路由,我们需要实现一个登录页面,以便用户可以输入他们的用户名和密码。我们将使用 EJS 模板引擎来实现登录页面。在 views 目录中创建一个名为 login.ejs 的文件,该文件包含以下代码:

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

在这段代码中,我们首先定义了一个 HTML 表单,该表单用于输入用户名和密码。表单的 method 属性设置为 POST,action 属性设置为 /login。在表单中,我们使用 label 和 input 元素来创建用户名和密码输入框。在表单的最后,我们使用 input 元素来创建一个提交按钮。

实现主页

现在,我们已经实现了登录页面和身份验证路由,我们需要实现一个主页,以便用户可以在登录后访问。在 views 目录中创建一个名为 index.ejs 的文件,该文件包含以下代码:

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

在这段代码中,我们首先定义了一个欢迎消息,该消息显示当前用户的用户名。我们还创建了一个链接,该链接用于注销当前用户。

实现注销路由

现在,我们已经实现了主页和注销链接,我们需要实现一个注销路由,以便用户可以注销当前会话。在 app.js 文件中添加以下代码:

在这段代码中,我们定义了一个 GET 路由,该路由用于注销当前用户。在路由的回调函数中,我们使用 req.logout() 方法来注销当前用户。然后,我们重定向到 /login 路由。

实现会话持久化

现在,我们已经实现了身份验证、登录页面、主页和注销路由,我们需要实现会话持久化。会话持久化是指在用户关闭浏览器后,用户仍然可以继续访问应用程序。在 Express.js 中,我们可以使用 express-session 和 passport-session 模块来实现会话持久化。

在命令行中运行以下命令安装这两个模块:

然后,在 app.js 文件中添加以下代码:

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

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

在这段代码中,我们首先引入了 express-session 和 passport-session 模块。然后,我们使用 app.use() 方法将这两个模块添加到 Express.js 应用程序中。在 session() 方法中,我们传递了一个 secret 参数。这个参数用于加密会话数据。在 passport.initialize() 和 passport.session() 方法中,我们将 Passport.js 添加到 Express.js 应用程序中。

完整示例代码

以下是一个完整的 Express.js 应用程序,该应用程序使用 Passport.js 进行身份验证:

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个示例中,我们使用了 EJS 模板引擎来实现视图。我们还使用了 express.urlencoded() 中间件来解析 POST 请求的正文。我们使用了 Passport.js 的 serializeUser() 和 deserializeUser() 方法来实现会话持久化。我们还使用了 req.flash() 方法来显示身份验证错误消息。

结论

在本文中,我们介绍了如何在 Express.js 中使用 Passport.js 进行身份验证。我们首先安装了 Passport.js 和 passport-local 模块。然后,我们创建了一个 Express.js 应用程序,并配置了 Passport.js。我们使用了 LocalStrategy 对象来验证本地用户名和密码。我们还实现了身份验证路由、登录页面、主页和注销路由。最后,我们实现了会话持久化,以便用户可以在关闭浏览器后继续访问应用程序。

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

纠错
反馈