在 Web 应用程序中,身份验证是非常重要的。而一种流行的身份验证方式是 JSON Web Tokens(JWTs)。在 Hapi.js 中,使用 JWTs 进行身份验证也是非常简单的。本文将介绍 Hapi.js 中 JWT 验证的基本原理、使用方法、实现方式以及相关问题。
什么是 JWT?
JSON Web Token(JWT)是一种用于在网络应用之间安全传递声明的基于 JSON 的开放标准。JWT 可以通过网络传输,并且用于验证传输的数据是否经过了身份验证和是否可以信任。通常被用于登录认证、单点登录等场景。
在 JWT 中,有三个部分:
- Header(头部):存储 JWT 使用的算法和类型信息。
- Payload(负载):存储包含声明(claims)信息和其他数据。
- Signature(签名):使用密钥对 Header 和 Payload 进行签名生成的一段字符串,用于验证数据的完整性。
使用 JWT 的好处是,可以将用户信息存储在 JWT 中,而不需要再发起一次数据库查询。这样,就可以减轻服务器的负担。
使用 Hapi.js 实现 JWT 验证
Hapi.js 是一个构建 Web 应用的 Node.js 框架,它提供了非常方便的 JWT 验证功能。下面是一个使用 Hapi.js 实现 JWT 验证的示例代码:
-- -------------------- ---- -------
----- ---- - ----------------------
----- ----------- - --------------------------
----- ------ - -------------
----- -----
----- -----------
---
-- -- --- ---
----- --------- - ----------------
-- ------
----- ----- - -
------ -
--- --
----- -------
-
--
-- -- --- -----
----- ------------ - ----- --------- -------- -- -- -
----- - -- - - --------
----- ---- - ----------
-- ------- -
------ - -------- ----- --
-
------ - -------- ---- --
--
----- ---- - ----- -- -- -
-- -- ----------- --
----- -----------------------------
-- -- --- -----
--------------------------- ------ -
---- ----------
--------- ------------
---
-- ------ --- -----
--------------
-
------- ------
----- ----
-------- --------- -- -- -
------ ------- --------
--
-------- -
----- -----
-
-
---
----- ---------------
------------------- ------- -- ---------------------
--
-------------------------------- ----- -- -
-------------------
----------------
---
-------以上代码中,我们首先定义了 JWT 的密钥和用户信息。接着,编写了一个 validateUser 方法,用于验证 JWT 是否合法。最后,使用 server.auth.strategy 方法定义了一个 JWT 验证的策略,并将其应用到路由中。
处理 JWT 过期
一般情况下,JWT 都会设置过期时间,以避免某个 JWT 被一直使用而不会过期,导致安全问题。在 Hapi.js 中,可以使用 jwt 验证策略的 options 参数来设置 JWT 的过期时间:
server.auth.strategy('jwt', 'jwt', {
key: jwtSecret,
validate: validateUser,
options: {
expiresIn: '30m'
}
});在以上代码中,expiresIn 参数用于设置 JWT 的过期时间,此处设置为 30 分钟。如果 JWT 已经过期,则该 JWT 将不再被验证。
处理路由级别的权限
在有些场景中,只有特定角色的用户才有权限访问某些页面或 API。在 Hapi.js 中,可以通过修改 validateUser 方法来实现这一功能。例如,我们可以在 users 对象中增加一个 role 字段,然后在 validateUser 方法中判断该用户是否具有访问权限:
-- -------------------- ---- -------
----- ----- - -
------ -
--- --
----- --------
----- -------
--
----- -
--- --
----- -------
----- ------
-
--
----- ------------ - ----- --------- -------- -- -- -
----- - -- - - --------
----- ---- - ----------
-- ------- -
------ - -------- ----- --
-
-- ---------- --- -------- -
------ - -------- ----- --
-
------ - -------- ---- --
--通过以上代码,我们只允许具有 admin 角色的用户访问该路由。
小结
在本文中,我们介绍了在 Hapi.js 中使用 JWT 进行身份验证的方法。JWT 不仅可以传递用户信息,而且还可以减轻服务器的负担。使用 Hapi.js 实现 JWT 验证非常简单,只需要使用 HapiAuthJwt 插件并定义策略即可。如果需要处理路由级别的权限,修改 validateUser 方法即可。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d61985a941bf7134bb9fb9