Hapi 中如何使用 Passport 进行身份验证

阅读时长 11 分钟读完

前言

在 Web 应用中,用户的身份验证是一个必要的功能。使用 Passport 可以方便的实现多种身份验证方式,这种模块化的设计也方便使用者自定义和配置。

Hapi 是一个现代化的 Node.js Web 应用框架,它的插件化设计让使用 Passport 身份验证变得非常简单。

本文将介绍如何在 Hapi 中使用 Passport 进行身份验证,并提供详细的代码示例和指导意义。

安装与配置 Passport

在开始使用 Passport 进行身份验证之前,我们需要先安装 Passport 及相关的身份验证策略。在 Node.js 中使用 npm 进行安装:

其中,passport-local 是一个对本地账号密码进行身份验证的策略。还可以安装其他策略,如 passport-facebookpassport-google-oauth 等。

安装完成后,需要在 Hapi 中注册 Passport 插件:

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

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

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

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

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

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

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

在上面的代码中,我们先使用 hapi-auth-cookie 插件注册一个 cookie 身份验证策略,并在 hapi-passport 插件中注册 passport 身份验证策略。

passport 身份验证策略使用了 passport-local 本地账号密码进行身份验证的策略。在本地验证策略中,我们需要实现一个验证函数,根据用户输入的账号密码进行验证,并调用 done 回调方法返回验证结果。

如果验证成功,调用 done(null, user) 方法,其中 user 是用户信息;如果验证失败,调用 done(null, false, { message: 'Invalid username or password' }) 方法,其中第三个参数 message 是认证失败的原因。

配置路由

在实现了 Passport 身份验证策略之后,我们需要在 Hapi 应用中配置一个路由来处理用户的登录请求。在登录页面中,用户会输入用户名和密码,并将这些信息提交到后端进行认证。

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

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

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

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

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

在上面的代码中,我们配置了一个 POST /login 路由,当用户提交登录表单时会访问这个路由。在路由处理函数中,首先获取用户提交的用户名和密码,然后调用 hapi-passportauthenticate 方法进行身份验证。

如果身份验证成功,将用户信息写入 cookie,然后重定向到首页;否则,显示登录页面并提示错误信息。

配置其它路由

在进行身份验证之后,我们可以配置一些需要身份认证的路由,在路由处理函数中可以通过 request.auth.credentials.user 访问用户信息。

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

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

在上面的代码中,我们配置了一个 GET / 路由,这个路由需要使用 session 身份验证策略验证用户身份。在路由处理函数中,我们获取用户信息,并通过视图返回首页。

示例代码

下面是一个完整的示例代码,包含了登录页面和首页的视图渲染代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

在本文中,我们介绍了如何在 Hapi 应用中使用 Passport 进行身份验证。通过简单的配置和编写,我们可以使用多种身份验证策略,包括本地账号密码验证、社交账号验证等。

Passport 是非常流行的 Node.js 身份验证库,可以简化身份验证过程,并提供了丰富的身份验证策略。在实际开发中,我们可以根据实际需要选择相应的策略,并进行配置和使用。

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

纠错
反馈