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

阅读时长 8 分钟读完

在现代 Web 应用程序中,用户认证是一个必不可少的功能。Express.js 是一个灵活的 Web 应用程序框架,而 Passport.js 是一个流行的用户认证库,它可以与 Express.js 无缝集成。本文将介绍如何使用 Express.js 和 Passport.js 实现用户认证。

安装和配置 Express.js 和 Passport.js

在开始之前,我们需要先安装和配置 Express.js 和 Passport.js。首先,我们需要在本地安装 Node.js 和 npm。然后,我们可以使用以下命令在项目文件夹中初始化一个新的 Node.js 应用程序:

然后,我们需要安装 Express.js 和 Passport.js:

以上命令将安装 Express.js、Passport.js、Passport.js 的本地策略和 Express.js 的会话中间件。

实现用户认证

接下来,我们将实现一个简单的用户认证系统。我们将使用 Passport.js 的本地策略,该策略使用用户名和密码进行身份验证。

首先,我们需要在 Express.js 应用程序中配置 Passport.js:

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

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

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

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

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

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

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

我们首先配置了 Express.js 的会话中间件和 Passport.js 的中间件。然后,我们使用 passport.use() 函数配置了 Passport.js 的本地策略。在本地策略中,我们可以实现用户身份验证逻辑。

接下来,我们需要实现序列化和反序列化逻辑。序列化用户对象时,我们只需要将用户 ID 存储在会话中。反序列化用户对象时,我们需要根据用户 ID 检索用户对象。

接下来,我们需要实现用户身份验证逻辑。在本例中,我们将使用一个简单的 JavaScript 对象来存储用户信息。在生产环境中,您应该将用户信息存储在数据库中。

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

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

在本例中,我们使用 Array.find() 方法查找具有指定用户名和密码的用户。如果找到用户,则将其传递给 done() 回调函数。否则,我们将传递一个错误消息。

接下来,我们需要实现反序列化逻辑:

在本例中,我们使用 Array.find() 方法根据用户 ID 查找用户对象。如果找到用户,则将其传递给 done() 回调函数。否则,我们将传递一个错误消息。

现在,我们已经完成了用户认证系统的配置。接下来,我们需要实现路由和视图。

实现路由和视图

我们将使用以下路由和视图来实现用户认证系统:

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

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

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

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

在上面的代码中,我们定义了四个路由:

  • /login:用于渲染登录表单的 GET 路由。
  • /login:用于处理登录表单提交的 POST 路由。我们使用 passport.authenticate() 函数来处理身份验证。如果身份验证成功,则重定向到主页。否则,重定向到登录表单。
  • /:用于渲染主页的 GET 路由。如果用户已经通过身份验证,则渲染主页。否则,重定向到登录表单。
  • /logout:用于处理注销请求的 GET 路由。我们使用 req.logout() 函数来注销用户会话。

现在,我们需要实现视图。我们将使用 EJS 模板引擎来渲染视图。在本例中,我们将使用以下两个视图:

  • login.ejs:用于渲染登录表单。
  • index.ejs:用于渲染主页。

以下是 login.ejs 的示例代码:

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

在上面的代码中,我们定义了一个简单的登录表单。如果身份验证失败,我们将在表单上显示错误消息。

以下是 index.ejs 的示例代码:

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

在上面的代码中,我们向用户显示欢迎消息,并提供一个注销链接。

运行应用程序

现在,我们已经完成了用户认证系统的实现。我们可以使用以下命令运行应用程序:

然后,我们可以在浏览器中访问 http://localhost:3000/login 来访问登录表单。如果我们输入正确的用户名和密码,我们将被重定向到主页。如果我们单击注销链接,我们将被重定向到登录表单。

结论

在本文中,我们介绍了如何使用 Express.js 和 Passport.js 实现用户认证。我们首先配置了 Express.js 和 Passport.js,然后实现了用户身份验证逻辑和路由和视图。通过使用本地策略,我们可以轻松地实现基于用户名和密码的身份验证。在生产环境中,您应该将用户信息存储在数据库中。

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

纠错
反馈