如何在 Hapi 中实现身份验证

阅读时长 9 分钟读完

在现代 Web 应用中,身份验证是保护用户数据安全的重要一环。Hapi 是一个开源的 Node.js Web 框架,它提供了一套身份验证插件,以便轻松地在应用程序中实现身份验证流程。

本文将详细讨论如何在 Hapi 中实现身份验证,涵盖以下内容:

  • Hapi 身份验证插件介绍
  • 安装和配置 Hapi 身份验证插件
  • 实现基本的身份验证功能
  • 实现基于 JSON Web Token(JWT)的身份验证

Hapi 身份验证插件介绍

Hapi 身份验证插件是一组可用于验证用户身份的插件。它提供了一系列可自定义的方案,包括:

  • 基于 cookie 的验证
  • 基于 JWT 的验证
  • 自定义验证策略

通过使用 Hapi 身份验证插件可以轻松地实现身份验证,使得你可以更专注于业务逻辑的实现,而不用太多关注身份验证的具体实现。

安装和配置 Hapi 身份验证插件

在你的 Hapi 项目中,首先需要安装 "hapi-auth-cookie" 插件或 "hapi-auth-jwt2" 插件(根据你的需求选择插件)。这里以 "hapi-auth-cookie" 插件为例:

在你的代码中导入模块:

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

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

之后你需要配置身份验证插件的选项。对于 "hapi-auth-cookie" 插件,你可以配置 cookie 的名称和过期时间:

这里的 password 选项用于加密 cookie,替换成你自己的加密密码。ttl 选项用于定义 cookie 的过期时间(这里是24小时)。

实现基本的身份验证功能

一旦你安装并配置了身份验证插件,你可以开始实现基本的身份验证功能。以下是一个例子,当用户访问受保护的页面时,会要求用户登录:

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

上面的示例中,auth 选项用于指定使用哪个验证策略,这里使用的是我们之前定义的 "session" 策略。这意味着只有在用户已登录的情况下才能访问 "/dashboard" 页面。

以下是一个用于呈现登录页面的路由:

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

然后我们需要在服务器上创建 POST 路由来处理用户提交的表单:

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

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

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

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

在这个路由处理程序中,我们首先获取通过 POST 请求提交的表单数据(用户名和密码)。然后,我们可以将这些凭据与数据库或其他数据源中存储的凭据进行比较,以验证用户身份。在本示例中,我们省略了验证步骤,并将用户名存储在 cookie 中作为已验证用户的标记。

最后,我们将用户重定向到 "/dashboard" 页面,并呈现欢迎消息。这时,如果再次访问 "/dashboard" 页面,将不再需要进行登录操作。

实现基于 JSON Web Token(JWT)的身份验证

除了基于 cookie 的身份验证,Hapi 身份验证插件还支持其他身份验证方案,如基于 JSON Web Token(JWT)的身份验证。

首先,你需要安装 "hapi-auth-jwt2" 插件:

在你的代码中导入模块并注册插件:

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

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

然后你需要配置身份验证插件的选项。对于 "hapi-auth-jwt2" 插件,你需要提供一个密钥,用于签署 JSON Web Token:

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

在这个示例中,我们配置了一个 "jwt" 验证策略,其 key 选项用于指定用于签署 JSON Web Token 的私钥。我们还提供了一个 validate 函数,以便在 token 解码后对其进行自定义验证。在本示例中,我们只是返回一个布尔值,表示 token 是有效的。

最后,我们需要在路由处理程序中使用 "jwt" 验证策略:

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

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

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

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

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

在登录处理程序中,我们使用 "jwt.sign" 函数来生成一个带有用户名负载的 token。这里的 token 在登录后通过 HTTP 响应返回给客户端,客户端可以将其存储在 localStorage 中以供今后使用。

然后在 "/dashboard" 路径的路由处理程序中,我们将 auth 选项设置为 "jwt",这表示只有带有正确的 token 的请求才能访问该页面。

总结

在本文中,我们介绍了如何在 Hapi 中使用身份验证插件,在应用程序中快速实现基于 cookie 或 JSON Web Token 的身份验证。希望这篇文章能为你提供详细的指导和学习资料。

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

纠错
反馈