如何在 Express.js 中使用 JSON Web Token(JWT)进行身份验证

阅读时长 6 分钟读完

随着 web 应用程序的不断增长和发展,安全性变得越来越重要。在现代 web 应用程序中,用户身份验证通常是其中的一个关键组件,因为它确保只有已登录用户可以访问应用程序的受限页面和资源。在本文中,我们将介绍如何在 Express.js 中使用 JSON Web Token (JWT) 进行身份验证,以便提高 web 应用程序的安全性。

什么是 JSON Web Token?

JSON Web Token 是一种安全传输信息的解决方案,它允许在两个应用程序之间传输数据,同时保证数据的完整性和机密性。该标准定义了一种紧凑且自包含的数据格式,其中数据以 JSON 对象的形式传输,并附有数字签名,以确保数据完整性。JWT 包含三个部分:头部、载荷和签名。

  1. 头部(Header):通常包含算法和令牌类型的信息,它指示接收者如何验证该令牌。
  2. 载荷(Payload):存储令牌内的信息,如用户角色和权限。载荷不加密,因此应避免在 JWT 中存储敏感信息。
  3. 签名(Signature):根据头部和载荷生成的数字签名以确保数据的完整性。

如何在 Express.js 中使用 JSON Web Token 进行身份验证?

现在我们来看看如何在 Express.js 中使用 JWT 进行身份验证。使用以下步骤:

步骤1:添加依赖项

您需要为您的项目添加以下依赖项:

  • express - 快速而灵活的 Node.js Web 应用程序框架
  • jsonwebtoken - JSON Web Token 轻量级实现
  • body-parser - Node.js 中间件,用于解析 JSON、Raw、文本和 URL 编码的数据。

步骤2:创建一个中间件

我们将创建一个名为 verifyToken 的中间件函数,该函数将从传入的请求中提取 JWT 并验证令牌。如果验证通过,则调用下一个中间件;否则,它将返回错误“未授权”。

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

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

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

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

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

在这个中间件函数中,我们首先从传入的请求头中提取 JWT 令牌。如果令牌不存在,则返回错误消息 "未授权"。如果令牌存在,则使用 secretKey 解密并验证令牌。如果验证通过,我们将从令牌中提取用户 ID,并调用下一个中间件。否则,我们将返回错误消息 "Token 无效"。

步骤3:创建登录和注册路由

接下来,我们将创建两个路由来处理用户登录和注册请求。我们将使用 /login/register 路由,这些路由将向服务器发送 POST 请求以进行身份验证和注册。

登录路由

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

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

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

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

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

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

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

在这个例子中,我们使用 jwt.sign() 方法为用户生成 JWT 令牌。我们还使用 verifyToken 中间件来保护 /me 路由,从而确保只有经过身份验证的用户可以访问该路由。如果 /me 路由被访问,verifyToken 中间件将验证 JWT 令牌,然后将用户 ID 附加到请求对象中。然后,处理具体业务逻辑。

注册路由

可以按照以下代码进行注册。

步骤4:运行服务器和测试

现在可以运行服务器并测试身份验证和保护的路由了。

使用 Postman 或任何其他 API 测试工具向服务器发送 POST 请求以模拟登录,如下所示:

如果用户名和密码有效,则服务器将生成一个 JWT 令牌,并将其返回到客户端。随后,我们将使用所返回的 JWT 令牌访问受保护的 /me 路由。

如果 JWT 令牌被正确解码和验证,则服务器将返回验证用户身份的响应。

总结

在本文中,我们讨论了如何在 Express.js 中使用 JSON Web Token 进行身份验证。JWT 提供了一种安全而简单的方式来保护您的系统资源并限制对资源的访问。我们看到如何创建一个中间件函数来解码和验证 JWT,并在受保护的路由中使用它来限制只有经过身份验证的用户才能访问。最后,我希望您现在已经掌握了如何在 Express.js 应用程序中实现身份验证并保护路由。

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

纠错
反馈