随着互联网和移动互联网的蓬勃发展,身份认证和鉴权越来越受到重视。其中,JWT(Json Web Token)已经成为流行的身份验证和鉴权方式之一。
在 Hapi 框架中,使用 JWT 实现鉴权可以保证系统的安全性以及用户的隐私保护。本文将详细介绍在 Hapi 框架中如何使用 JWT 实现鉴权,并提供示例代码。
JWT 简介
JWT(Json Web Token)是一种结构化的、用于身份验证和鉴权的 JSON 格式的数据格式。它在网络应用中传递信息时,通常使用 JSON Web 签名(JWS)或 JSON Web 加密(JWE)进行加密以及签名。
JWT 由三部分组成:
- Header(头部)
- Payload(载荷)
- Signature(签名)
Header 包含了 JWT 的类型和签名算法信息,例如常用的是 HS256(HMAC 算法,使用 SHA-256 散列函数)。
Payload 包含了 JWT 的核心信息,例如用户名、角色等,可以根据自己的需求定义。
Signature 是对 Header 和 Payload 的签名,签名过程需要使用 Header 中指定的算法以及密钥进行计算,以确保数据的完整性和真实性。
Hapi 框架中的 JWT 鉴权
Hapi 是一个 Node.js 的 Web 应用程序框架,它提供了开箱即用的安全性和鉴权机制,包括 OAuth、JWT 等。
下面,我们将演示在 Hapi 框架中如何使用 JWT 实现鉴权。
安装依赖
在开始实现之前,需要安装以下依赖:
npm i hapi joi hapi-auth-jwt2 jsonwebtoken
- hapi 是 Hapi 框架的核心依赖。
- joi 是一个用于数据验证和格式化的库。
- hapi-auth-jwt2 是 Hapi 框架的 JWT 插件,用于验证 JWT 的有效性。
- jsonwebtoken 是一个 JWT 库,用于生成和解析 JWT。
实现鉴权功能
在 Hapi 中,实现 JWT 鉴权需要以下步骤:
- 创建一个用于生成 JWT 的密钥。通常,我们可以将密钥保存在环境变量中,通过 process.env 获取,以防止密钥泄露。
const JWT_SECRET_KEY = process.env.JWT_SECRET_KEY;
- 在路由的路由配置对象中,添加 auth 属性,并指定方案为 jwt。
-- -------------------- ---- ------- ----- ------ - - - ------- ------ ----- ------------- -------- ----------------- -------- - ----- ------ -- -- --
- 在 Hapi 服务器的注册方法中,注册 hapi-auth-jwt2 插件。
-- -------------------- ---- ------- ------------------------------------------ ----- -- - -- ----- - ------------------- - --------------------------- ------ - ---- --------------- --------- ------------- -------------- - ----------- --------- -- --- --------------------------- ---
在上面的代码中,我们首先使用 server.register 方法注册 hapi-auth-jwt2 插件。接着,在注册插件之后,我们可以使用 server.auth.strategy 方法创建一个 JWT 鉴权策略。validate 属性指定用于验证 JWT 的方法,verifyOptions 中指定签名的算法。最后,通过 server.auth.default 方法设置默认的鉴权策略为 jwt。
- 在验证 JWT 的方法 validateUser 中,判断 JWT 是否有效,如果有效则通过 callback 返回用户信息,其中,request.auth.credentials 存储了 JWT 的载荷信息。
const validateUser = (decoded, request, callback) => { const user = getUserById(decoded.id); if (user) { return callback(null, true, user); } return callback(null, false); };
在这个示例中,我们通过 getUserById 方法根据 JWT 的载荷信息(id 字段)查询是否存在该用户,如果存在就返回 true 并将用户信息保存在 request.auth.credentials 中,否则返回 false。
- 如果 JWT 验证失败,Hapi 框架会返回 401 错误,提示用户需要提供有效的 JWT。如果验证成功,则允许用户访问相应的受保护的路由。
示例代码
下面是一个示例代码,展示了在 Hapi 框架中如何使用 JWT 实现鉴权。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- --- - --------------- ----- -------------- - --------------------------- ----- ------------------- - -------------------------------- ----- ----- - - - --- -- --------- -------- --------- ------------ ----- -------- -- - --- -- --------- -------- --------- ------------ ----- -------- -- -- ----- ------ - --- ------------- ----- ----- ----- ------------ --- ----- ------------ - --------- -------- --------- -- - ----- ---- - ------------------------ -- ------ - ------ -------------- ----- ------ - ------ -------------- ------- -- ----- ----------- - ---- -- - ------ ----------------- -- - ------ ------- --- ------------ ---- --- -- ----- -------- - ---- -- - ----- ------- - - -- -- ------ ----------------- --------------- - ---------- ------------------- --- -- ----- ------------ - ----- --------- -- -- - ----- - --------- -------- - - ---------------- ----- ---- - ----------------- -- - ------ ------------- --- -------- -- ------------- --- --------- --- -- ------ - ----- ----- - ------------------ ------ - ----- -- - ------ ------------------------------------- -- ----- ---------------- - ----- --------- -- -- - ------ - ----- ------------------------ -- -- ----- ------ - - - ------- ------- ----- --------- -------- ------------- -------- - ----- ------ --------- - -------- ------------ --------- -------------------------------------------------- --------- ----------------------------------------------------- --- -- -- -- - ------- ------ ----- ------------- -------- ----------------- -------- - ----- ------ -- -- -- ----- ---- - ----- -- -- - ----- ------------------------------------------- --------------------------- ------ - ---- --------------- --------- ------------- -------------- - ----------- --------- -- --- --------------------------- --------------------- ----- --------------- ------------------- ------- --- --------------------- -- -------------------------------- ----- -- - ------------------- ---------------- --- -------
在这个示例代码中,我们实现了一个简单的登录和受保护的路由,具体实现细节见代码注释。
总结
本文详细介绍了在 Hapi 框架中如何使用 JWT 实现鉴权,包括安装依赖、实现鉴权功能以及示例代码。通过 JWT 实现鉴权可以保证系统的安全性以及用户的隐私保护。在实现过程中,我们强烈建议将密钥保存在环境变量中,以防止密钥泄露。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6655aeb0d3423812e4a713a9