Express.js 中使用 Passport 实现用户认证

阅读时长 9 分钟读完

在现代 web 应用程序中,用户认证是必不可少的功能。有许多开源的认证库可以使用,其中 Passport 是最流行的之一。它是一个可扩展的 Node.js 应用程序,可用于通过多种认证方式进行用户认证。在本文中,我们将探讨如何在 Express.js 中使用 Passport 实现用户身份认证。

安装 Passport 和相关模块

在开始之前,我们需要确保安装了 Node.js 和 Express.js。然后,我们可以使用 npm 安装 Passport 和相关模块:

解释一下上述命令:

配置 Passport 中间件

接下来我们需要在 Express.js 中配置 Passport 中间件。在 app.js 文件中添加以下代码:

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

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

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

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

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

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

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

让我们逐步解释代码。首先,我们需要导入所需的 JavaScript 库。在这个例子里,我们导入了 Express.js、express-session、passport 和 passport-local。

然后,我们为 Express.js 应用程序配置了 session 和 Passport 中间件。session() 函数返回中间件,用于管理客户端和服务器之间的会话状态。因为我们的会话状态需要在客户端和服务器之间共享,所以我们需要将 secret 设置为一个加密密钥。passport.initialize()passport.session() 是 Passport 中间件,用于设置和存储用户的认证状态。

接下来,我们需要设置序列化和反序列化功能来支持用户认证。序列化函数将用户对象转换为唯一的标识符,反序列化函数将标识符转换回用户对象。这个过程让 Passport 能够存储和提取用户对象。

最后,我们需要配置本地策略(即使用用户名和密码进行身份验证)。在这个例子中,我们使用了本地策略,并通过 findOne() 函数查询用户数据库以查找匹配的用户。如果找到了用户,我们将调用 validPassword() 函数来验证密码,如果验证成功,则 Passport 将设置用户的认证状态。如果未找到用户或密码不正确,则 Passport 会将响应的状态设置为 false

配置路由

接下来,我们需要设置路由,用于处理用户登录、注册等网页上的操作。在 app.js 文件中添加以下代码:

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

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

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

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

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

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

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

在这段代码中,我们定义了根目录、登录、注册和注销路由。在根目录路由中,我们使用 render() 方法渲染 index.ejs 模板,并将认证的用户对象传递给模板。在登录和注册路由中,我们使用 render() 方法来渲染登录和注册页面。在 authenticate() 方法中,我们使用本地策略进行身份验证。如果身份验证成功,则将用户重定向到根目录,并且在失败的情况下重定向到登录页面。在注册路由中,我们创建了一个新用户对象,并将其保存到数据库中。在注销路由中,我们调用 logout() 方法来清除用户的认证状态。

模板和视图

最后,让我们创建模板和视图文件。在 views 目录中,我们将创建以下文件:

views/index.ejs:

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

views/login.ejs:

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

views/signup.ejs:

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

在这些模板中,我们使用 EJS 模板语言来定义视图。在 index.ejs 模板中,我们根据用户是否已登录来显示欢迎信息。在登录和注册模板中,我们使用表单和 POST 方法来处理用户输入。

运行应用程序

现在,运行应用程序并在浏览器中输入 http://localhost:3000 来访问页面。在访问登录或注册页面时,您应该被重定向到特定的 URL。当您输入错误的用户名或密码时,系统应该返回错误消息。当您成功登录后,您应该被重定向到主页,并且您应该看到欢迎消息。当您注册新用户后,您应该能够登录并访问主页。

总结

在本文中,我们学习了在 Express.js 中使用 Passport 实现用户认证。我们了解了如何配置 Passport 中间件和本地策略,并定义了相关的路由和视图。现在,您应该能够使用 Passport 来管理用户的身份验证,并在自己的 web 应用程序中实现安全的用户体验。别忘了,始终需要小心保护和管理用户的敏感信息和凭证。

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

纠错
反馈