Hapi 框架使用 Hapi-auth-jwt2 插件实现 JWT Token 鉴权

在前端开发中,用户身份认证和授权是非常重要的。JSON Web Token (JWT) 是一种跨语言、跨平台、轻量级的身份认证和授权解决方案。Hapi 框架是一个可扩展的 Node.js 后端框架,提供了许多内置的插件来协助开发者实现许多功能,其中也包括实现 JWT Token 鉴权的 Hapi-auth-jwt2 插件。

JWT Token 简介

JWT 由三部分组成:Header、Payload 和 Signature。

Header 包含了 Token 的类型和所使用的算法,例如:

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

Payload 包含了 Token 所携带的信息,例如:

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

Signature 则是使用密钥对 Header 和 Payload 进行签名生成的,例如:

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

JWT 通常以字符串的形式传递,可以存储在客户端的 cookie 或 localStorage 中,也可以通过 HTTP 请求的 Authorization Header 携带。

Hapi-auth-jwt2 插件介绍

Hapi-auth-jwt2 插件可以帮助我们在 Hapi 应用中实现 JWT Token 的认证和授权功能。该插件提供了 jwt-auth-strategy 来定义一个新的认证策略,并支持自定义的 JWT Token 解析函数和验证函数。

安装和使用

首先我们需要安装 hapi-auth-jwt2jsonwebtoken 两个依赖:

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

然后在 Hapi 应用中注册该插件:

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

其中,validateFunc 函数定义了如何验证 JWT Token 的有效性和权限,接受两个参数:decoded (解码后的 Payload) 和 request (请求对象)。

例如,在下面的示例中,我们将验证 JWT Token 的有效性和权限:

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

在路由中使用 jwt 认证策略:

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

生成 Token

在用户登录成功后,我们需要生成 JWT Token 并将其发送给客户端,客户端可以使用 Token 进行后续的请求。

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

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

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

其中,sign 函数用于生成 Token,接受三个参数:Payload、密钥和选项。expiresIn 指定了 Token 的有效期,可以接受多种格式 (详情请参阅官方文档:https://github.com/auth0/node-jsonwebtoken#usage)。

鉴权示例

下面是一个完整的 Hapi 应用的示例代码,其中包含了如何使用 Hapi-auth-jwt2 插件来实现 JWT Token 鉴权的方法。

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

总结

本文介绍了如何在 Hapi 应用中使用 Hapi-auth-jwt2 插件来实现 JWT Token 鉴权,并提供了详细的示例代码。JWT 提供了一种轻量级、可扩展的身份认证和授权解决方案,具有跨语言、跨平台的特点,在现代化的 Web 应用中得到了广泛的应用。

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