Node.js 中如何使用 JWT 进行身份验证和授权

在现代的 Web 应用中,用户认证和授权是非常重要的,因为它们可以保护您的应用程序和用户数据不受非法访问。JSON Web Token(JWT)是一种基于标准 JSON 格式的轻量级令牌,可用于验证和授权用户。

在本文中,我们将学习如何在 Node.js 中使用 JWT 进行身份验证和授权,并提供一些示例代码。

什么是 JSON Web Token

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以 JSON 对象形式安全地传输信息。JWT 可以用于身份验证和授权。

JWT 由三段信息组成,这三段信息分别用 "." 分开,它们分别是:

  • Header:JWT 的头部用于描述 JWT 的元数据信息,如算法、类型等。
  • Payload:负载是 JWT 的中心部分,它包含要传输的信息,通常是用户 ID、权限或其他有关用户和应用程序的信息。
  • Signature:签名是 JWT 的密钥部分,用于验证该令牌是否来自可信任的源。

安装和设置 JWT

使用 Node.js 编写应用程序时,我们可以使用 jwt-simple 库来快速方便地生成和验证 JWT。

使用以下命令安装 jwt-simple:

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

然后,导入 jwt-simple 库并设置一个秘密密钥:

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

创建和签发 JWT

要生成 JWT,我们需要定义头部、载荷和签名。下面是一些示例代码,用于创建 JWT:

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

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

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

在上述示例中,我们定义了头部,指定了加密算法和 Token 类型。我们还定义了载荷,包含一些有关用户的信息,并设置了 Token 的有效时间。

然后,我们使用 jwt-simple 库的 encode() 方法来生成签名,该方法接受三个参数:载荷、秘密密钥和头部。

当 JWT 生成时,您可以将其发送给客户端,以便客户端可以使用它进行后续请求。

验证 JWT

在客户端向服务器进行后续请求时,服务器需要验证 JWT 是否有效,并根据其表示的权限或其他信息授权或拒绝访问。以下是一些示例代码,用于验证 JWT:

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

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

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

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

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

在上述示例中,我们首先从请求头中获取 JWT,然后使用 jwt-simple 库的 decode() 方法将其解码。然后,我们验证 JWT 中的载荷是否存在且有效,并在请求对象上设置用户 ID,以便后续中间件使用。如果 JWT 无效,则返回 401 错误。

结论

现在,您已经了解了如何在 Node.js 中使用 JWT 进行身份验证和授权,包括生成和验证 JWT 的示例代码。通过使用 JWT,您可以轻松地保护您的应用程序和用户数据免受非法访问。

请注意,JWT 不是银弹,您应该采取其他安全措施来确保您的应用程序和用户数据的完整性和机密性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6722feec2e7021665e0dbac6