Hapi 框架中如何使用 JWT 实现鉴权

阅读时长 9 分钟读完

随着互联网和移动互联网的蓬勃发展,身份认证和鉴权越来越受到重视。其中,JWT(Json Web Token)已经成为流行的身份验证和鉴权方式之一。

在 Hapi 框架中,使用 JWT 实现鉴权可以保证系统的安全性以及用户的隐私保护。本文将详细介绍在 Hapi 框架中如何使用 JWT 实现鉴权,并提供示例代码。

JWT 简介

JWT(Json Web Token)是一种结构化的、用于身份验证和鉴权的 JSON 格式的数据格式。它在网络应用中传递信息时,通常使用 JSON Web 签名(JWS)或 JSON Web 加密(JWE)进行加密以及签名。

JWT 由三部分组成:

  • Header(头部)
  • Payload(载荷)
  • Signature(签名)

Header 包含了 JWT 的类型和签名算法信息,例如常用的是 HS256(HMAC 算法,使用 SHA-256 散列函数)。

Payload 包含了 JWT 的核心信息,例如用户名、角色等,可以根据自己的需求定义。

Signature 是对 Header 和 Payload 的签名,签名过程需要使用 Header 中指定的算法以及密钥进行计算,以确保数据的完整性和真实性。

Hapi 框架中的 JWT 鉴权

Hapi 是一个 Node.js 的 Web 应用程序框架,它提供了开箱即用的安全性和鉴权机制,包括 OAuth、JWT 等。

下面,我们将演示在 Hapi 框架中如何使用 JWT 实现鉴权。

安装依赖

在开始实现之前,需要安装以下依赖:

  • hapi 是 Hapi 框架的核心依赖。
  • joi 是一个用于数据验证和格式化的库。
  • hapi-auth-jwt2 是 Hapi 框架的 JWT 插件,用于验证 JWT 的有效性。
  • jsonwebtoken 是一个 JWT 库,用于生成和解析 JWT。

实现鉴权功能

在 Hapi 中,实现 JWT 鉴权需要以下步骤:

  1. 创建一个用于生成 JWT 的密钥。通常,我们可以将密钥保存在环境变量中,通过 process.env 获取,以防止密钥泄露。
  1. 在路由的路由配置对象中,添加 auth 属性,并指定方案为 jwt。
-- -------------------- ---- -------
----- ------ - -
  -
    ------- ------
    ----- -------------
    -------- -----------------
    -------- -
      ----- ------
    --
  --
--
  1. 在 Hapi 服务器的注册方法中,注册 hapi-auth-jwt2 插件。
-- -------------------- ---- -------
------------------------------------------ ----- -- -
    -- ----- -
        -------------------
    -
    
    --------------------------- ------ -
        ---- ---------------
        --------- -------------
        -------------- - ----------- --------- --
    ---
    
    ---------------------------
---

在上面的代码中,我们首先使用 server.register 方法注册 hapi-auth-jwt2 插件。接着,在注册插件之后,我们可以使用 server.auth.strategy 方法创建一个 JWT 鉴权策略。validate 属性指定用于验证 JWT 的方法,verifyOptions 中指定签名的算法。最后,通过 server.auth.default 方法设置默认的鉴权策略为 jwt。

  1. 在验证 JWT 的方法 validateUser 中,判断 JWT 是否有效,如果有效则通过 callback 返回用户信息,其中,request.auth.credentials 存储了 JWT 的载荷信息。

在这个示例中,我们通过 getUserById 方法根据 JWT 的载荷信息(id 字段)查询是否存在该用户,如果存在就返回 true 并将用户信息保存在 request.auth.credentials 中,否则返回 false。

  1. 如果 JWT 验证失败,Hapi 框架会返回 401 错误,提示用户需要提供有效的 JWT。如果验证成功,则允许用户访问相应的受保护的路由。

示例代码

下面是一个示例代码,展示了在 Hapi 框架中如何使用 JWT 实现鉴权。

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

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

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

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

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

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

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

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

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

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

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

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

-------

在这个示例代码中,我们实现了一个简单的登录和受保护的路由,具体实现细节见代码注释。

总结

本文详细介绍了在 Hapi 框架中如何使用 JWT 实现鉴权,包括安装依赖、实现鉴权功能以及示例代码。通过 JWT 实现鉴权可以保证系统的安全性以及用户的隐私保护。在实现过程中,我们强烈建议将密钥保存在环境变量中,以防止密钥泄露。

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

纠错
反馈