什么是 JWT
JWT(JSON Web Tokens)是一种基于 JSON 数据格式的轻量级身份验证和授权的规范。它可以在用户和服务器之间安全地传输声明。JWT 可以通过签名(使用规则和密钥)来验证数据的完整性和真实性,并且仅使用可信任的信息进行身份验证。
JWT 由三部分组成:头部、载荷和签名。头部中包含了加密算法和 token 类型等信息,载荷中则包含了与用户相关的信息,例如用户 ID 和用户名等。签名则通过将头部、载荷和密钥进行加密生成。由于 JWT 是基于 JSON 格式的,因此非常灵活且易于读取和生成。
Hapi 框架及其身份验证插件
Hapi 是一个基于 Node.js 的完整、可配置、高效和安全的 Web 应用程序框架。其优点包括可扩展性强,有丰富的插件支持,以及底层基于事件驱动的非阻塞架构。由于其可靠性和高性能,Hapi 被广泛用于构建各种 Web 应用程序和服务。
Hapi 还提供了一个名为 hapi-auth-jwt2 的身份验证插件,其为 JWT 身份验证提供了高度集成、可扩展和易于使用的支持。此插件实现了基于 JWT 身份验证文档的规范,并具有许多有用的功能,如黑名单支持、自定义验证函数、缓存策略和 token 强制刷新等。
如何使用 JWT 进行身份验证
下面给出了一个简单的 Hapi 应用程序,其中包含基本的身份验证和路由保护功能。该应用程序将使用 JWT 进行身份验证,以检查每个请求的有效性。
首先,需要安装必要的依赖项:
npm install hapi hapi-auth-jwt2 jsonwebtoken
接下来,我们创建一个 index.js 文件,并添加以下代码:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- --- - ------------------------ ----- --- - --------------------- ----- ------- - -------------------------- ----- ------ - --- ------------- ----- ------------ ----- ---- --- ----- ----- - - - --- -- --------- -------- --------- ----------- -- - --- -- --------- -------- --------- ----------- -- - --- -- --------- -------- --------- ----------- - -- ----- ------------ - ----- --------- -------- -- -- - ----- ---- - ------------ -- ---- --- ------------ -- ------- - ------ - -------- ----- -- - ------ - -------- ---- -- -- ----- ----- - ----- -- -- - ----- ------------------------- --------------------------- ------ - ---- --------- --------- ------------- -------------- - ----------- --------- - --- -------------- ------- ------- ----- --------- -------- --------- -- -- - ----- - --------- -------- - - ---------------- ----- ---- - ------------ -- ---------- --- -------- -- ---------- --- ---------- -- ------- - ------ - ------ -------------- -- - ----- ----- - ---------- --- -------- --------- ------------- -- ---------- ------ - ----- -- -- -------- - ----- ------ --------- - -------- ------------ --------- ------------------------ --------- ----------------------- -- - - --- -------------- ------- ------ ----- ----------- -------- --------- -- -- - ------ - -------- ------------------------ -- -- -------- - ----- ----- - --- ----- --------------- ------------------- ------- ----- ----------------- -- --------
在上面的代码中,我们首先定义了三个用户对象和一个用户验证方法 validateUser。验证方法中检查传递的 JWT 中的 id 值是否与 users 数组中的任何一个对象的 id 属性匹配。如果匹配,则返回有效状态。
接下来,我们在 server.auth.strategy() 方法中使用 JWT 插件定义了一个名为 'jwt' 的身份验证策略。该策略使用 'secret' 密钥来签名 JWT,并使用 validateUser 方法验证 JWT 中的信息是否正确。verifyOptions 属性中指定了使用的加密算法。
我们还定义了两个路由。第一个路由是 /login,用于检查传入的凭证是否有效,并在验证通过后生成一个有效的 JWT。第二个路由是 /profile,需要进行身份验证,并返回用户信息(即 JWT 中的负载)。
在 /login 路由中,我们将从请求正文中提取 username 和 password,并使用这些值在 users 数组中进行查找。如果找到了相应的用户,则使用 JWT 签名生成一个新 token,并将其作为响应返回。否则,返回未经授权的错误信息。
在 /profile 路由中,我们使用 options.auth 属性来指定路由需要进行身份验证,并使用 request.auth.credentials 访问 JWT 载荷。
总结
在本文中,我们已经了解了 JWT 的基本概念和用法,并演示了如何在 Hapi 应用程序中使用它进行身份验证。通过使用 hapi-auth-jwt2 插件和 JWT 规范,我们可以轻松地实现安全的身份验证和授权功能,以及可扩展的自定义验证。希望这篇文章对于学习身份验证和 Hapi 框架的人能够提供一些基本的指导和启示。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e1b541f6b2d6eab3ce8292