如何在 Hapi 框架中使用 JWT 进行用户验证

在 Web 应用开发中,用户验证是一个非常重要的环节。传统的基于 cookie 的验证方式存在一些问题,比如 CSRF(跨站请求伪造)攻击。JWT(JSON Web Token)是一种比较流行的基于 token 的验证方式,它可以解决一些传统验证方式存在的问题,并且具有很好的扩展性和灵活性。本文将介绍如何在 Hapi 框架中使用 JWT 进行用户验证。

什么是 JWT?

JWT 是一种基于 JSON 的 token,它由三部分组成:header、payload 和 signature。header 包含了 token 的类型和加密算法等信息;payload 包含了 token 的内容,比如用户 ID、角色等;signature 是对 header 和 payload 进行加密后的结果,用于验证 token 的真实性。

JWT 的优点在于它可以在服务端生成 token,并将其发送给客户端保存。客户端每次请求时,都需要将 token 发送给服务端进行验证。这样可以避免 CSRF 攻击,并且可以灵活控制 token 的有效期和权限等。

如何在 Hapi 中使用 JWT?

在 Hapi 中使用 JWT 需要安装两个插件:hapi-auth-jwt2jsonwebtokenhapi-auth-jwt2 是 Hapi 的一个认证插件,它可以将 JWT 集成到 Hapi 的认证系统中。jsonwebtoken 是 node.js 中用于生成和验证 JWT 的模块。

安装插件:

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

注册插件:

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

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

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

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

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

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

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

--------

在上面的代码中,我们首先定义了一个 validate 函数,用于验证 token 是否有效。在该函数中,我们可以根据解密后的 token 内容和当前请求对象进行验证,并返回验证结果和用户信息。然后,我们通过 server.auth.strategy 方法配置 JWT 认证,指定加密密钥、验证函数和验证选项。最后,我们通过 server.auth.default 方法配置默认认证策略为 JWT 认证。

现在,我们可以在路由中使用认证策略了:

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

在上面的代码中,我们定义了一个 /protected 路由,指定认证策略为 JWT。这样,客户端每次请求该路由时,都需要将 token 发送给服务器进行验证。

如何生成和发送 JWT?

在客户端中,我们可以使用 jsonwebtoken 模块生成和发送 JWT。首先,我们需要使用加密密钥对用户信息进行加密:

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

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

在上面的代码中,我们定义了一个 user 对象,包含了用户 ID 和名称。然后,我们使用 jwt.sign 方法对该对象进行加密,指定加密密钥和有效期。最后,我们得到了一个 token。

接下来,我们可以将该 token 发送给服务器。在请求头中添加 Authorization 字段,值为 Bearer ${token}

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

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

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

在上面的代码中,我们使用 axios 发送了一个 GET 请求,指定了请求头中的 Authorization 字段为 Bearer ${token}。这样,服务器就可以使用该 token 进行验证了。

总结

JWT 是一种流行的基于 token 的用户验证方式,可以解决传统验证方式存在的问题,并具有很好的扩展性和灵活性。在 Hapi 框架中,我们可以使用 hapi-auth-jwt2jsonwebtoken 插件实现 JWT 认证。通过认证策略和路由配置,客户端每次请求受保护的路由时都需要发送 token 进行验证。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65fb92ced10417a22272736d