在 Hapi.js 中实施身份认证和授权

阅读时长 17 分钟读完

在构建 web 应用程序时,安全往往是至关重要的因素之一。 身份认证和授权是 web 应用程序中的两个基本安全措施。 在本文中,我们将使用 Hapi.js 框架来实现身份认证和授权。

什么是身份认证?

身份认证是验证用户的身份和凭据的过程。 对于 web 应用程序,身份认证意味着验证用户输入的凭据(例如用户名和密码)是否与保存在应用程序中的相应凭据匹配。

在 Hapi.js 中,可以使用多种方法实现身份认证,包括:

  • Cookie-based authentication
  • Token-based authentication
  • OAuth2

Cookie-based authentication

当用户输入用户名和密码时,服务器会验证凭据并返回一个带有session ID的 response。此 session ID 使用浏览器 cookie 存储在客户端,以允许用户继续访问受保护的页面而无需重新输入凭据。

以下是使用 Hapi.js 和 hapi-auth-cookie 插件执行 cookie-based authentication 的示例代码:

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

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

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

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

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

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

--

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

-------

Token-based authentication

Token-based authentication 是一个强大的身份验证方法,它不使用 cookie 并且可以用于跨多个服务进行身份验证。

在 token-based authentication 中,用户首先提供一组凭据,例如用户名和密码,然后服务器验证凭据并生成一个 token。此 token 作为响应传递给客户端,通常是 JSON 格式。此后,客户端将此 token 作为身份凭据随着每个请求一起发送。

在 Hapi.js 中,可以使用多种插件和技术来实现 token-based authentication,包括:

  • JSON Web Tokens (JWT)
  • Hawk

以下是使用 JWT 和 hapi-auth-jwt2 插件执行 token-based authentication 的示例代码:

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

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

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

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

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

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

--

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

-------

什么是授权?

授权是确定哪些用户可以访问受保护的页面或资源的过程。授权通常基于用户的身份认证。

在 Hapi.js 中,可以使用多种插件和技术来实现授权,包括:

  • Scope-based access control
  • Role-based access control

Scope-based access control

Scope-based access control 通过分配用户权限和资源访问范围来实现资源访问控制。每个角色都被授予一组定义的权限,并针对特定资源的受信任范围进行访问控制。

以下是使用 Hapi.js 和 hapi-scopes 插件执行 scope-based access control 的示例代码:

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

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

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

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

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

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

--

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

-------

Role-based access control

Role-based access control 通过将资源访问权限分配给用户组或角色来实现资源访问控制。

以下是使用 Hapi.js 和 hapi-rbac 插件实现 role-based access control 的示例代码:

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

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

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

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

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

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

--

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

-------

结论

在本文中,我们介绍了 Hapi.js 中身份认证和授权的基础知识,并提供了 scope-based access control 和 role-based access control 的示例代码。 Hapi.js 框架提供了许多用于身份验证和授权的强大插件和库,因此可以根据您的需求选择最适合的解决方案。

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

纠错
反馈