Hapi.js JWT 身份验证实践

前言

在现代 Web 应用程序中,安全性和身份验证是至关重要的。为了保护用户的隐私和数据,开发人员必须采取一些措施来确保只有授权的用户才能访问敏感数据和功能。JSON Web Token (JWT) 是一种流行的身份验证机制,它提供了一种安全的方式来传输信息,以便在不同的系统之间进行身份验证。

Hapi.js 是一个现代化的 Node.js Web 框架,它提供了一个强大的插件体系结构,使开发人员能够轻松地添加身份验证和安全性功能。在本文中,我们将介绍如何在 Hapi.js 中使用 JWT 进行身份验证,并提供一些示例代码来帮助您入门。

JWT 的工作原理

在使用 JWT 进行身份验证之前,我们需要了解一下它的工作原理。JWT 由三部分组成:头部、载荷和签名。头部和载荷都是 JSON 格式的数据,签名是使用私钥对头部和载荷进行加密得到的字符串。

当用户登录时,服务器会生成一个 JWT 并将其发送回客户端。客户端将 JWT 存储在本地,并在以后的每个请求中将其发送回服务器。服务器使用公钥来验证 JWT 的签名,并从中提取有关用户的信息。如果 JWT 有效,则用户被视为经过身份验证。

在 Hapi.js 中使用 JWT

在 Hapi.js 中使用 JWT 进行身份验证非常简单。我们可以使用 hapi-auth-jwt2 插件来实现这一目标。该插件提供了一个策略,使我们能够验证 JWT 并从中提取信息。

首先,我们需要安装 hapi-auth-jwt2 插件:

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

接下来,我们需要在 Hapi.js 服务器中注册该插件:

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

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

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

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

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

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

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

这里我们将 hapi-auth-jwt2 插件注册到 Hapi.js 服务器中,并创建了一个名为“jwt”的策略。我们还指定了一个密钥,该密钥将用于签名和验证 JWT。我们还指定了一个验证函数,该函数将在每个请求中调用以验证 JWT 的有效性。最后,我们还指定了一个加密算法(HS256),该算法将用于签名和验证 JWT。

现在我们已经创建了一个 JWT 策略,我们可以使用它来保护我们的 API。我们只需将“jwt”策略应用于需要身份验证的路由即可:

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

在这里,我们创建了一个名为“/api/protected”的路由,它需要身份验证才能访问。我们只需将“jwt”策略应用于此路由即可。

示例代码

下面是一个完整的示例代码,展示了如何在 Hapi.js 中使用 JWT 进行身份验证:

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

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

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

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

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

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

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

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

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

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

在这个示例中,我们创建了两个路由。第一个路由是“/api/login”,它接受用户名和密码,并返回一个 JWT。第二个路由是“/api/protected”,它需要身份验证才能访问。

在“/api/login”路由中,我们使用 jwt-simple 库来创建 JWT。我们将用户名编码为 JWT 的载荷,并使用“my-secret-key”密钥对其进行签名。然后我们将 JWT 发送回客户端,客户端将在以后的每个请求中将其发送回服务器。

在“/api/protected”路由中,我们需要身份验证才能访问。我们将“jwt”策略应用于此路由,这将导致 hapi-auth-jwt2 插件在每个请求中验证 JWT 的有效性。在这个示例中,我们只允许用户名为“admin”的用户访问此路由。

结论

在本文中,我们介绍了如何在 Hapi.js 中使用 JWT 进行身份验证。我们使用 hapi-auth-jwt2 插件创建了一个策略,并将其应用于需要身份验证的路由。我们还提供了一个示例代码,帮助您入门,并展示了如何使用 jwt-simple 库来创建和验证 JWT。希望本文对您有所帮助,祝您编写出更安全的 Web 应用程序!

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