如何在 Hapi 框架中使用 JWT 进行身份认证

阅读时长 5 分钟读完

前言

在 web 应用中,用户身份认证是一个非常重要的过程。传统身份验证方式通常是基于 cookie 或 session 实现的,但这些方式需要额外的服务器存储并且容易遭受 CSRF 攻击。JWT(JSON Web Token)是一种比较先进的认证方式,通过在客户端生成令牌,而无需在服务器端进行存储从而提供更加安全的认证机制。本篇文章将介绍如何在 Hapi 框架中使用 JWT 进行身份认证。

JWT 概述

JWT 由三部分构成:头部、载荷和签名。头部包含令牌类型和使用的签名算法,载荷包含令牌的信息,签名可以确保 token 的不可篡改和真实性。

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

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

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

安装 Hapi 和相关插件

在开始编写代码之前,需要安装以下依赖:

  • hapi - Node.js web 应用框架
  • hapi-auth-jwt2 - Hapi 的 JWT 认证插件
  • jsonwebtoken - JWT 生成和验证库

创建并配置 Hapi 服务器

以下是一个简单的 Hapi 服务器:

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

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

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

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

配置 JWT 认证策略

接下来,需要配置 JWT 认证策略。在 Hapi 中,可以使用 server.auth.strategy 方法来实现。hapi-auth-jwt2 插件提供了一个默认的解析 JWT 的逻辑,我们可以通过配置 validate 方法来实现对令牌的验证。下面是一个例子:

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

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

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

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

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

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

如上所示,我们需要实现 validate 方法来验证解密后的令牌。在这个例子中,我们简单地验证令牌是否包含了 sub 字段来判断令牌是否是有效的。同时,使用 Bearer 的方式从请求头部获取令牌,遵循 HTTP 字段规范。

最后,需要设置 options.auth 属性为 token 来指示 Hapi 使用 token 认证策略进行身份验证。

生成 JWT 令牌

客户端需要先通过身份验证获取 JWT 令牌,然后在后续请求中将令牌添加到 Authorization 头部。下面是一个在 Node.js 中生成 JWT 令牌的例子:

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

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

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

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

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

最后,开启服务器并使用 HTTP 客户端向服务器发送带身份认证的请求即可完成身份认证过程。

总结

本文介绍了如何在 Hapi 框架中使用 JWT 进行身份认证。通过使用 hapi-auth-jwt2 插件,我们能够方便地实现 JWT 的认证机制,并通过简单的示例代码演示了如何在 Hapi 中使用 JWT 进行身份认证。

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

纠错
反馈