如何使用 Hapi 在 Node.js 中使用 JWT 令牌

阅读时长 5 分钟读完

JSON Web Token (JWT) 是一种安全通信协议,用于在应用程序和服务器之间传递信息,以确认已验证的用户。在 Node.js 中,Hapi 是一个常用的 Web 应用程序框架,它可以帮助开发人员快速有效地创建 API。在这篇文章中,我们将学习如何在 Hapi 中使用 JWT 令牌进行认证与授权。

什么是 JWT?

JWT 是一个基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传输信息。它可以用于验证身份和访问控制。由三段数据组成:Header 头,Payload 负载和 Signature 签名。

Header:包含声明类型,即 JWT 令牌的类型和使用的算法。

Payload:是 JWT 令牌实际需要传递的信息。可以包含用户 ID,用户名和有效期信息等。

Signature:是对前面两部分的签名,确保数据的完整性和身份验证。

Hapi 中使用 JWT

Hapi 框架提供了一个名为 hapi-auth-jwt2 的插件,可用于验证和授权 JWT 访问控制。下面是使用该插件来保护路由的示例代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在上面的代码中,我们首先导入了必要的库和插件,并创建了一个名为 server 的 Hapi 实例。我们还定义了一个 users 数组,当用户尝试登录时,我们会用这个数组来查询已注册用户的凭据。此外,我们使用 'secret' 变量作为演示的 JWT 密钥。

接下来,我们注册了 hapi-auth-jwt2 插件,并创建了一个名为 'jwt' 的认证策略。我们指定了密钥 privateKey,这将用于生成和验证 JWT 签名。validateFunc 函数将在每次请求发送到受保护的路由时调用以进行用户验证。如果找到用户,则将调用传递给它的 callback 函数并返回 true。否则,将返回 false。

在我们的路由配置中,我们添加了一个名为 'auth' 的选项,指定了我们的 JWT 认证策略。这意味着,如果用户未经身份验证尝试访问受保护路由,将会收到 401 Unauthorized 响应。另一方面,如果用户已经通过身份验证,将会收到 'You are authenticated!' 响应。

最后,我们添加了一个名为 '/login' 的路由,用于处理用户登录请求。在这个路由中,我们首先从 request.payload 中获取用户名和密码信息,然后搜索 users 数组来查找相应的用户。如果找到了,我们使用 Jwt.sign 函数来生成 JWT。返回的响应中包含 JWT 令牌,将在后续的请求中用于身份验证。

结论

使用 JWT 流程简单明了,可以实现无状态的身份验证,并可方便地在多个服务底层之间传递。在 Node.js 中,Hapi 提供了强大的且易于使用的插件 hapi-auth-jwt2,使开发人员可以轻松实现 JWT 认证和授权。在本文中,我们介绍了 JWT 的基础知识和 Hapi 中使用 JWT 的示例代码,希望可以帮助您更好地理解和应用 JWT 认证技术。

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

纠错
反馈