使用 Hapi 框架实现 JSON Web Token 授权

阅读时长 7 分钟读完

随着互联网的发展,Web 应用的开发变得越来越普遍。在这个过程中,授权是必不可少的一部分,以确保只有授权的用户访问应用程序。JSON Web Token (JWT)是一种用于身份验证和授权的开放标准,广泛用于Web应用程序中。Hapi框架是一个基于Node.js的框架,可以快速构建高质量的Web应用程序。

在本文中,我们将介绍如何使用Hapi框架实现JWT授权。我们将从JWT的基础开始,然后介绍如何在Hapi应用程序中使用JWT。最后,我们将提供一个示例应用程序,演示如何使用Hapi框架实现JWT授权。

什么是JSON Web Token?

JSON Web Token是一种使用JSON作为通信格式的开放标准。它被设计用于安全地在两个方之间传输信息。JWT由三个部分组成:头部(header)、载荷(payload)和签名(signature)。头部包含令牌类型和算法,载荷包含有关令牌的信息,例如用户ID,过期时间等。签名是使用密钥对令牌进行加密的,以确保令牌未被篡改。

JWT的一大优势是它是无状态的,这意味着它们不需要存储在服务器上,因此可以轻松地通过不同的服务器进行传递。这使得JWT成为一种非常适合使用微服务和分布式系统的授权方式。

在Hapi应用程序中使用JWT

我们将使用 hapi-auth-jwt2 插件来在Hapi应用程序中使用JWT。该插件提供了实现JWT授权所需的所有功能。

  1. 安装 hapi-auth-jwt2 插件
  1. 注册插件
  1. 定义验证策略

在上面的代码中,key是对令牌进行签名的密钥。validate 是一个用于验证 JWT 载荷的函数。验证函数接收三个参数:decodedrequestcallbackdecoded包含JWT载荷,request是当前请求对象,callback是一个回调函数,用于指示验证是否成功。

  1. 应用验证策略
-- -------------------- ---- -------
--------------
    ------- ------
    ----- --------------
    -------- --------- -- -- -
        ------ ---- --- ------------
    --
    -------- -
        ----- -----
    -
---

在上面的代码中,我们定义了一个需要JWT验证才能访问的路由。通过在路由的选项中指定auth: 'jwt',将 jwt 验证策略应用于该路由。

示例应用程序

最后,让我们看一下一个使用Hapi框架实现JWT授权的示例应用程序。该应用程序使用JWT对用户进行身份验证,在用户成功登录后,将生成JWT并将其发送回客户端。客户端在每个请求上都会发送该令牌,服务端会验证该令牌的有效性,并返回必要的数据。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-------

在上面的代码中,我们首先定义了 users 对象,其中包含一个用户名为 john 的用户。我们使用 Bcrypt 来哈希用户的密码。 在 validate 函数中,我们检查JWT的ID是否与已知用户的ID匹配。如果是,则验证通过。

在登录路由中,我们首先检查用户是否存在,如果存在,则检查密码是否正确。如果登录成功,我们使用密钥 privateKey 签名JWT并将其发送回客户端。

在受限路由中,我们检查传入的JWT是否有效,并在这种情况下提取关联的用户数据。

结论

在本文中,我们介绍了如何使用Hapi框架实现 JWT 授权。我们首先介绍了JWT的基础知识,然后介绍了在Hapi应用程序中实现JWT授权所需的步骤。最后,我们提供了一个完整的示例应用程序,以帮助您了解如何使用Hapi框架实现JWT授权。

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

纠错
反馈