Hapi 与 Authentication 插件:完整指南

阅读时长 13 分钟读完

Hapi 是一个用于构建 Web 应用的 Node.js 框架,它有许多可扩展的插件,其中 Authentication 插件是那些需要鉴权或授权的应用场景下非常重要的一个。本篇文章旨在提供一个完整的指南,介绍如何使用 Hapi 和 Authentication 插件构建一个具有用户认证和授权的 Web 应用程序。

安装和配置 Hapi

要开始使用 Hapi 框架,首先需要安装 Node.js 和 npm(Node.js 包管理器)。安装完毕后,可以通过下面的命令安装 Hapi:

接下来需要在项目的根目录中创建一个 server.js 文件,然后使用以下代码来初始化一个 Hapi 服务器:

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

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

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

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

-------

上面的代码创建了一个 Hapi 服务器并监听 localhost:3000 上的请求。这里只定义了一个路由,当用户访问根路径时,服务器将返回 “Hello World!”。启动服务器后,可以在浏览器中访问 http://localhost:3000,看到 “Hello World!” 的输出。

安装和配置 Authentication 插件

为了启用用户认证和授权,需要安装和配置 Hapi-auth-cookie 插件,它提供了一个基于 Cookie 的身份验证策略来轻松地实现身份验证和会话管理。安装 Hapi-auth-cookie 插件的命令如下:

安装后,需要在 Hapi 服务器中加载插件:

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

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

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

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

-------

在上面的代码中,server.register(Cookie) 加载了 Hapi-auth-cookie 插件。成功加载后,可以使用 server.auth.strategy 函数来定义一个身份验证策略:

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

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

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

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

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

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

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

-------

server.auth.strategy('session', 'cookie', {...}) 定义了一个名为 session 的身份验证策略,基于 Cookie 并使用一个传输到浏览器的令牌来管理用户身份。选项对象包含一些属性,如 namepasswordisSecure 等。其中 name 是 Cookie 的名称,password 是一个编码密码,用于解密浏览器发送的 Cookie 值,isSecure 表示 Cookie 是否应该只通过 HTTPS 连接发送(不建议在开发环境中使用 HTTPS),redirectTo 表示用户未经身份验证时应该重定向到的 URL,validateFunc 是一个验证函数,用于验证当前请求的 Cookie 和存储在服务器上的凭证是否匹配。

server.auth.default('session')session 身份验证策略设置为默认策略。

创建登录和登出路由

现在已经准备好了身份验证和身份验证策略,可以创建一个登录路由并在其中使用 request.cookieAuth.set() 方法来设置有效会话的 Cookie。在这个示例中,我们将在路由处理程序中设置一个带有用户名和密码的静态 IIFE 函数来进行用户认证。

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

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

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

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

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

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

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

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

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

-------

上面的代码中,新路由是 POST /login 和 GET /logout。登录路由将{username, password}的用户凭证作为负载传递,并使用 getUserFromCredentials 函数验证这些凭证。如果凭据是有效的,则通过调用 request.cookieAuth.set({ id: user.id }) 将会话 ID 存储到 Cookie 中,以便重新验证时可以读取。最后,如果用户已通过身份验证,则返回一条“Logged in!” 的响应消息,反之则显示 “Incorrect username or password!” 。

登出路由从 request.cookieAuth.clear() 方法中清除会话 ID,以删除客户端 Cookie 中存储的凭证。

保护路由

现在,可以使用 auth 选项来保护希望授权访问的路由。 Hapi 的路由处理程序接受两个参数:一个请求对象和 h 对象(它是一个用于服务器响应的工具)。

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

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

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

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

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

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

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

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

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

-------

上面的代码中,GET /protected 路由已经添加了 options.auth: 'session'。这表示客户端必须提供有效的身份验证 Cookie 才能访问该路由。如果没有提供任何 Cookie,则会自动重定向到 redirectTo 选项指定的 URL。

结论

在本文中,我们了解了如何使用 Hapi 和 Authentication 插件构建具有用户认证和授权的网络应用程序。 我们学习了如何安装和配置 Hapi-auth-cookie 插件,如何使用插件来实现身份验证和会话管理,并演示了如何设置登录和登出路由以及保护某些路由以进行授权。希望这篇文章对你有帮助,可以在日后的开发中更快地创建更加安全的应用程序。

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

纠错
反馈