如何实现基于 JWT 的 Hapi.js 身份验证与会话管理

阅读时长 6 分钟读完

前端开发中的身份验证和会话管理一直是重要的话题。Hapi.js 是一个流行的 Node.js 框架,它提供了轻松实现身份验证和会话管理的方式。本文将介绍如何使用 JSON Web Token (JWT) 实现 Hapi.js 的身份验证和会话管理。

什么是 JWT?

JSON Web Token (JWT) 是一种用于安全通信的开放标准(RFC 7519)。JWT 由三部分组成:头部、载荷和签名。头部包含了有关该令牌的信息,例如它使用的加密算法。载荷包含了有关用户或会话的信息,例如用户 ID、姓名和电子邮件地址。签名部分用于验证该令牌的真实性。

JWT 的主要优点是它们是无状态的,因此不需要在服务器上存储任何会话信息。这比使用传统的 cookie 和服务器端会话更加安全和灵活。

创建 Hapi.js 服务器和路由

首先,我们需要创建一个 Hapi.js 服务器和路由。以下是一个基本的服务器和路由代码:

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

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

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

这将创建一个在本地主机的端口 3000 上运行的 Hapi.js 服务器,并为根路由设置了一个简单的“Hello, world!”响应。

添加身份验证插件

接下来,我们需要添加 Hapi.js 的身份验证插件。Hapi.js 的身份验证插件是非常强大和灵活的,可以轻松地集成各种身份验证和授权方案。在本文中,我们将使用 hapi-auth-jwt2 插件来实现 JWT 身份验证。

您可以使用以下命令安装 hapi-auth-jwt2 插件:

然后,我们将在服务器上注册 hapi-auth-jwt2 插件,并为其指定一个密钥,该密钥将用于签署我们的 JWT 令牌:

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

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

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

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

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

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

在上面的代码中,我们已经定义了一个 validate 函数,该函数用于验证 JWT 令牌是否有效。在该函数中,我们可以检查用户是否存在、是否过期等等。verifyOptions 属性指定 JWT 签名算法,这里我们使用的是 HS256。

现在,我们已经在服务器上注册了身份验证策略,并将其设置为默认策略。我们还需要在路由上使用这个策略,以便为受保护的路由添加身份验证。

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

在上面的代码中,我们为路由设置了 auth 属性,并将其设置为“jwt”。这将指示 Hapi.js 为该路由使用我们的身份验证策略。

创建 JWT 令牌

现在,我们已经设置了 Hapi.js 的身份验证插件,我们需要创建一个 JWT 令牌。为此,我们可以使用 jsonwebtoken 模块来签署令牌。

我们将在 /login 路由中创建 JWT 令牌。以下是一个简单的代码片段,用于为用户创建令牌:

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

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

在上面的代码中,我们从数据库获取用户,并为用户名签署了一个 JWT 令牌。此令牌在我们的应用程序中可以传输,并用于身份验证和授权。

使用 JWT 令牌进行身份验证

现在我们已经创建了 JWT 令牌,让我们尝试使用它进行身份验证。以下是一个简单的客户端代码示例,用于向服务器发送 JWT 令牌:

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

在上面的代码中,我们首先向 /login 路由发送用户名和密码,从而获取 JWT 令牌。然后,我们将该令牌添加到我们的请求头中,并向 /protected 路由发送请求。如果 JWT 令牌有效并且未过期,服务器将返回“Protected route”。

总结

在本文中,我们介绍了如何使用 Hapi.js 和 JWT 实现身份验证和会话管理。我们使用 hapi-auth-jwt2 插件注册了 JWT 策略,并在路由上使用了该策略。我们还创建了 JWT 令牌并使用它进行身份验证。这些技术可以用于创建安全、可扩展和灵活的 Node.js Web 应用程序。

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

纠错
反馈