使用 JWT 进行 Hapi 框架身份验证教程

阅读时长 6 分钟读完

什么是 JWT

JWT(JSON Web Tokens)是一种基于 JSON 数据格式的轻量级身份验证和授权的规范。它可以在用户和服务器之间安全地传输声明。JWT 可以通过签名(使用规则和密钥)来验证数据的完整性和真实性,并且仅使用可信任的信息进行身份验证。

JWT 由三部分组成:头部、载荷和签名。头部中包含了加密算法和 token 类型等信息,载荷中则包含了与用户相关的信息,例如用户 ID 和用户名等。签名则通过将头部、载荷和密钥进行加密生成。由于 JWT 是基于 JSON 格式的,因此非常灵活且易于读取和生成。

Hapi 框架及其身份验证插件

Hapi 是一个基于 Node.js 的完整、可配置、高效和安全的 Web 应用程序框架。其优点包括可扩展性强,有丰富的插件支持,以及底层基于事件驱动的非阻塞架构。由于其可靠性和高性能,Hapi 被广泛用于构建各种 Web 应用程序和服务。

Hapi 还提供了一个名为 hapi-auth-jwt2 的身份验证插件,其为 JWT 身份验证提供了高度集成、可扩展和易于使用的支持。此插件实现了基于 JWT 身份验证文档的规范,并具有许多有用的功能,如黑名单支持、自定义验证函数、缓存策略和 token 强制刷新等。

如何使用 JWT 进行身份验证

下面给出了一个简单的 Hapi 应用程序,其中包含基本的身份验证和路由保护功能。该应用程序将使用 JWT 进行身份验证,以检查每个请求的有效性。

首先,需要安装必要的依赖项:

接下来,我们创建一个 index.js 文件,并添加以下代码:

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

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

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

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

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

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

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

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

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

--------

在上面的代码中,我们首先定义了三个用户对象和一个用户验证方法 validateUser。验证方法中检查传递的 JWT 中的 id 值是否与 users 数组中的任何一个对象的 id 属性匹配。如果匹配,则返回有效状态。

接下来,我们在 server.auth.strategy() 方法中使用 JWT 插件定义了一个名为 'jwt' 的身份验证策略。该策略使用 'secret' 密钥来签名 JWT,并使用 validateUser 方法验证 JWT 中的信息是否正确。verifyOptions 属性中指定了使用的加密算法。

我们还定义了两个路由。第一个路由是 /login,用于检查传入的凭证是否有效,并在验证通过后生成一个有效的 JWT。第二个路由是 /profile,需要进行身份验证,并返回用户信息(即 JWT 中的负载)。

在 /login 路由中,我们将从请求正文中提取 username 和 password,并使用这些值在 users 数组中进行查找。如果找到了相应的用户,则使用 JWT 签名生成一个新 token,并将其作为响应返回。否则,返回未经授权的错误信息。

在 /profile 路由中,我们使用 options.auth 属性来指定路由需要进行身份验证,并使用 request.auth.credentials 访问 JWT 载荷。

总结

在本文中,我们已经了解了 JWT 的基本概念和用法,并演示了如何在 Hapi 应用程序中使用它进行身份验证。通过使用 hapi-auth-jwt2 插件和 JWT 规范,我们可以轻松地实现安全的身份验证和授权功能,以及可扩展的自定义验证。希望这篇文章对于学习身份验证和 Hapi 框架的人能够提供一些基本的指导和启示。

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

纠错
反馈