使用 Hapi.js 和 JWT 创建身份验证微服务

介绍

在现代应用程序中,安全是至关重要的。由于互联网时代大量用户账号的出现,为用户操作带来了风险。因此,身份验证是应用程序的核心部分之一。在本文中,我们将深入探讨如何使用 Hapi.js 和 JWT 创建身份验证微服务。

Hapi.js

Hapi.js 是一个流行的 Node.js Web 框架,它提供了一组工具和插件,来构建可扩展的 Web 应用程序。与其他 Web 框架不同,Hapi.js 的焦点并不仅在于 HTTP 路由,它更强调开发者友好性和可测试性。

JWT

JSON Web Token(JWT)是一种开放标准,它定义了一种紧凑、自包含的格式,用于在双方之间安全地传输信息。它通常用于身份验证和授权,因为它可以帮助我们识别请求的来源并对其进行授权。

如何使用 Hapi.js 和 JWT 来创建身份验证微服务

在本文中,我们将学习如何使用 Hapi.js 和 JWT 来创建身份验证微服务。此服务将由以下主要组件组成:

  • 数据库:此服务将使用 MongoDB 数据库。
  • Hapi.js:我们将使用此框架来构建此服务。
  • JWT:我们将使用此标准来创建和验证用户令牌。

以下是实现此服务的步骤:

安装和配置 Hapi.js

首先,我们需要安装 Hapi.js 及其相关插件:

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

然后,我们需要创建一个新项目并安装所需插件:

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

接下来,我们创建一个基本的 Hapi.js 应用程序,并在其中设置身份验证插件:

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

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

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

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

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

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

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

-------

这是一个简单的 Hapi.js 应用程序示例,其中定义了两个路由:一个公共路由和一个受保护路由。您可以通过访问 /protected 路由来验证身份验证插件是否正常工作。

添加 MongoDB 数据库支持

接下来,我们需要添加对 MongoDB 数据库的支持。为此,我们将使用 Mongoose,它是一个流行的 MongoDB ORM。首先,我们需要安装 mongoose:

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

然后,我们将设置和配置数据库:

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

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

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

在这个例子中,我们连接到名为 myapp 的 MongoDB 数据库。然后,我们定义 Users 模型以存储用户记录。

添加注册和登录路由

在此步骤中,我们将添加用于注册和登录用户的路由。这些路由将接收来自客户端的有效负载并对其进行验证和处理。对于此示例,我们将使用 @hapi/joi 库来验证请求的有效负载。

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个例子中,首先我们定义了路由 /register/login。 它们都将接收来自客户端的有效负载并对其进行验证。如果有效负载通过验证,则将保存或查找用户,并使用 bcrypt 加密和验证密码。

/register 路由中,我们根据输入有效负载创建新用户。同时,我们还检查是否存在具有相同电子邮件的用户。如果存在,我们将返回 Boom.badRequest,从而表示该请求不合法。

/login 路由中,我们将查找用户并验证其密码。最后,我们使用 jsonwebtoken 库生成并返回 JWT。

测试服务

我们现在可以通过执行以下命令来测试这个服务:

--- -----

我们可以通过访问 /register/login 路由来测试服务的身份验证功能。

例如,如果我们要注册新用户,则应该发出类似以下示例有效负载的 POST 请求:

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

如果请求有效,则应该返回以下响应:

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

如果我们要登录,则应发出类似以下示例有效负载的 POST 请求:

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

如果请求有效,则应该返回以下响应,其中包含我们生成的 JWT:

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

接下来,我们可以使用生成的 JWT 访问受保护的路由。例如,我们可以通过将 JWT 放在 Authorization 标头中并向 /protected 路由发送 GET 请求来测试此功能:

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

如果 JWT 是有效的,则应该返回以下响应:

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

否则,将返回 401 Unauthorized 响应。

结论

在本文中,我们学习了如何使用 Hapi.js 和 JWT 创建身份验证微服务。我们学习了如何:安装和配置 Hapi.js 框架、链接 MongoDB 数据库、验证和处理有效负载、加密和验证密码,并生成 JWT 以供身份验证使用。现在,您可以使用本文的指南和示例代码来创建您自己的身份验证微服务。

参考资料

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670b3961d91dce0dc8888bf5