使用 Express.js 和 JWT 构建安全 Web 应用程序的方法

阅读时长 8 分钟读完

在当今互联网时代, Web 开发日益流行,越来越多的人加入了这个领域。在 Web 开发中,安全性是最重要的因素之一。为了保护用户数据和防止攻击,我们需要使用一些安全机制来保障应用程序的安全性。JSON Web Token(JWT)是一种安全的方案,它可以防止攻击者通过伪造令牌来破坏我们的应用程序。

在本篇文章中,我们将介绍如何使用 Express.js 和 JWT 构建安全 Web 应用程序。

准备工作

首先,我们需要创建一个新的 Express.js 应用程序,并将其安装到本地计算机上。以下是如何执行此操作的步骤:

  1. 安装 Node.js
  2. 在命令行中输入以下命令:npm install -g express-generator
  3. 创建新的 Express.js 应用程序:express --view=ejs myapp
  4. 进入应用程序目录:cd myapp
  5. 安装依赖项:npm install

我们现在准备好了,我们可以开始构建我们的应用程序了。

创建路由

首先,我们需要创建一些路由来处理用户的请求。我们将创建以下路由:

  1. /api/login:用于用户登录并返回 JWT 令牌。
  2. /api/protected:用于用户访问需要身份验证的受保护资源。

routes 文件夹中创建一个新的文件 user.js

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

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

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

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

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

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

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

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

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

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

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

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

分析代码:

  1. 我们首先导入 expressjsonwebtoken 模块。
  2. 我们定义了一个 users 对象,它包含每个用户的用户名和密码。
  3. 我们创建了 post 路由,用于处理用户的登录请求。我们首先获取请求体中的用户名和密码,并检查它们是否与我们在 users 对象中定义的用户名和密码匹配。
  4. 如果用户名和密码匹配,我们将生成一个 JWT 令牌并将其返回给用户。
  5. 我们创建了一个 get 路由,用于访问需要身份验证的受保护资源。我们首先获取请求头中的 JWT 令牌并检查其是否存在。
  6. 如果令牌存在,我们将验证它,并解析负载数据以提取用户名。然后,我们向用户发送一条包含欢迎信息的 JSON 响应。
  7. 如果令牌无效或已过期,则向用户发送一条消息,并返回 401 状态码。

我们已经创建了路由,因此现在可以开始构建我们的应用程序模型了。

构建模型

models 文件夹中创建一个新的文件 user.js

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

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

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

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

我们只创建了一个简单的 User 类,它包含一个静态 find 方法,用于查找具有给定用户名的用户。这是一个假设的实现,我们可以将其替换为使用实际数据库的查询。

集成身份验证

现在我们已经创建了路由和模型,我们需要使用身份验证中间件来保护我们的应用程序资源。

app.js 中增加以下中间件:

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

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

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

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

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

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

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

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

分析代码:

  1. 我们首先导入 jsonwebtoken 模块和 User 模型。
  2. 我们定义了一个 authenticate 中间件函数,它处理身份验证逻辑。与之前的路由处理函数相比,它多了一个步骤:检查用户是否存在。
  3. 如果找不到用户,则向用户发送一条消息,并返回 401 状态码。
  4. 如果用户存在,则将其添加到 req.user 对象中,并调用 next() 函数。
  5. 我们将 authenticate 中间件添加到 userRouter 上,以保护所有受 /api/protected 前缀的路由。

测试应用程序

我们已经创建了应用程序,现在可以使用 Postman 等工具测试它。我们首先需要使用 /api/login 路由登录,并获取 JWT 令牌:

我们可以通过将令牌添加到请求头中,在 /api/protected 上进行访问:

如果我们在请求头中提供的令牌是无效或已过期的,则将收到以下响应:

如果我们在登录时提供了错误的用户名或密码,则将收到以下响应:

总结

我们已经介绍了如何使用 Express.js 和 JWT 构建安全的 Web 应用程序。我们创建了两个路由:一个用于用户登录,并返回 JWT 令牌;另一个用于访问需要身份验证的受保护路由。我们还创建了一个 User 模型,并使用身份验证中间件来保护我们的应用程序资源。

JWT 令牌和身份验证中间件都是 Web 开发中常使用的安全机制。它们可以防止攻击者通过伪造令牌来破坏我们的应用程序。但是,许多其他安全问题需要我们注意,如 XSS,CSRF 等。保持对我们应用程序的不断审查,将有助于保护其安全。

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

纠错
反馈