Express.js 中如何处理会话管理和认证

阅读时长 9 分钟读完

在现代 Web 应用中,会话管理和认证是非常关键的部分。无论是提供个人化的用户体验还是保护用户的隐私,都需要对用户进行身份验证并在其活动期间跟踪他们的会话。在 Express.js 中,处理会话管理和认证可以使用多种方式,这篇文章将探讨其中的一些方法。

什么是会话管理?

会话是指在一段时间内,用户与应用程序交互的过程。例如,用户登录到应用程序中,然后可以执行一些操作,然后在一段时间后注销或者关闭浏览器。这整个时间段被称为会话。为了实现会话管理,需要检测用户何时开始和结束会话,并在此期间存储和检索有关用户的信息。

在 Express.js 中,可以使用不同的技术来实现会话管理。有些基于 cookie,有些使用会话存储,还有一些使用 JSON Web Token (JWT)。

基于 Cookie 的会话管理

Cookie 是存储在用户浏览器中的小文件,存储在客户端的数据。当用户从一个页面到另一个页面时,浏览器会将 cookie 发送到服务器,服务器可以根据 cookie 上的数据来识别用户,并获取相关信息。

针对 Web 应用程序,基于 cookie 的会话管理是一种常见的方法,这种方法会将会话信息存储在浏览器中,当用户再次访问应用程序时,应用程序会使用这些信息来重新创建会话。

以下是一个使用 express-session 库和 cookie-parser 中间件的示例代码:

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

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

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

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

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

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

此代码中创建了一个 Express 应用程序,并使用 express-session 中间件来初始化会话管理。cookie-parser 中间件可以帮助解析请求中的 cookie。当用户访问 /login 路由时,将在会话中设置一个名为 user 的新属性。在 /profile 路由中,会检查会话中是否存在 user,如果存在就返回用户的用户名。

基于会话存储的会话管理

与基于 cookie 的会话管理方法不同,基于会话存储的方法将会话信息存储在服务器端。通常情况下,服务器将为每个会话生成唯一的 ID,并将这些 ID 存储在数据库或内存中。这种方法提供了更好的安全性,因为用户不能修改会话数据,也可以更轻松地支持大量用户和集群。

Express.js 使用默认的会话存储,但是也可以使用其他存储库。以下是一个使用 MongoDB 作为会话存储的示例代码:

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

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

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

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

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

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

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

此代码中使用 connect-mongo 库将 Express 会话存储在 MongoDB 数据库中。通过连接 MongoDB 实例,使用 session 中间件来初始化会话管理。在 /login/profile 路由上的代码与前面使用 cookie 管理会话的示例相同。

什么是认证?

认证是确定用户身份的过程。在 Web 应用程序中,常见的方法是使用基本身份验证 (Basic Authentication) 或者 OAuth2。当用户尝试登录应用程序时,应用程序检查用户提供的凭据,并进行身份验证。如果凭据是有效的,则应用程序给用户分配一个授权令牌,使其可以访问受保护的资源。

在 Express.js 中,可以使用多种方式进行身份验证,例如使用 HTTP 基本身份验证、Passport.js 等。

HTTP 基本身份验证

HTTP 基本身份验证是最简单和最基础的身份验证方法。它是通过在 HTTP 头中包含用户名和密码来实现的。在请求时,客户端会将用户名和密码编码为 base64 字符串,然后在请求头中添加 Authorization 字段。

以下是一个使用 HTTP 基本身份验证的示例代码:

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

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

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

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

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

此代码中,使用 express-basic-auth 中间件来处理基本身份验证。users 对象包含用户名和密码,该对象在每个请求上被使用以验证用户凭据。此示例中,用户名为 admin,密码为 supers3cr3t

Passport.js

Passport.js 是一个广泛用于 Node.js 应用程序的身份验证中间件。它提供了各种身份验证策略,包括本地策略、OAuth 策略和 OpenID 策略。使用 Passport.js 的好处是,它可以与多个身份验证策略协作,以满足不同应用程序的需求。

以下是在 Express.js 中集成 Passport.js 的示例代码:

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

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

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

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

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

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

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

此代码中使用 passport-local 中间件来实现本地身份验证策略。在应用程序中注册本地策略后,可以使用 passport.authenticate() 方法来验证请求中的凭据。如果用户通过验证,则可以在 req 对象的 user 属性中找到用户的详细信息。在此示例中,可以在 /login 路由和 /profile 路由中使用 Passport.js 来处理身份验证。

结论

在本文中,我们介绍了如何在 Express.js 中处理会话管理和身份验证。虽然本文没有详细讨论所有方法,但可以作为一个起点,帮助开发者了解如何使用 express-session、cookie-parser、connect-mongo 和 Passport.js。对于开发人员来说,了解如何处理身份验证和会话管理是建立安全和可靠 Web 应用程序的重要步骤。

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

纠错
反馈