在 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 方法即可。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d61985a941bf7134bb9fb9