JSON Web Token (JWT) 是一种安全通信协议,用于在应用程序和服务器之间传递信息,以确认已验证的用户。在 Node.js 中,Hapi 是一个常用的 Web 应用程序框架,它可以帮助开发人员快速有效地创建 API。在这篇文章中,我们将学习如何在 Hapi 中使用 JWT 令牌进行认证与授权。
什么是 JWT?
JWT 是一个基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传输信息。它可以用于验证身份和访问控制。由三段数据组成:Header 头,Payload 负载和 Signature 签名。
Header:包含声明类型,即 JWT 令牌的类型和使用的算法。
Payload:是 JWT 令牌实际需要传递的信息。可以包含用户 ID,用户名和有效期信息等。
Signature:是对前面两部分的签名,确保数据的完整性和身份验证。
Hapi 中使用 JWT
Hapi 框架提供了一个名为 hapi-auth-jwt2 的插件,可用于验证和授权 JWT 访问控制。下面是使用该插件来保护路由的示例代码:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- --- - ------------------------ ----- ------- - -------------------------- ----- ------ - --- ------------- ----- ----- ----- ----------- --- ----- ----- - - - --- -- --------- ------- --------- ----------- ----- ----- ---- - -- ----- ---------- - --------- ------------------------ ----- -- - -- ----- ----- ---- --------------------------- ------ - ---- ----------- ------------- --------- -------- --------- -- - ----- ---- - ------------ -- ---- --- ------------ -- ------- - ------ -------------- ------- - ------ -------------- ------ -- -------------- - ----------- --------- - --- -------------- ------- ------ ----- ------------- ------- - ----- ----- -- -------- --------- -- -- - ------ ---- --- ---------------- - --- -------------- ------- ------- ----- --------- -------- --------- -- -- - ----- - --------- -------- - - ---------------- ----- ---- - ------------ -- ---------- --- -------- -- ---------- --- ---------- -- ------- - ------ ------------------- ------------------------ - ----- ----- - ---------- --- ------- -- ----------- - ---------- ---- --- ------ - ----- -- - --- ----- --------------- ------------------- ------- --- --------------------- ---
在上面的代码中,我们首先导入了必要的库和插件,并创建了一个名为 server 的 Hapi 实例。我们还定义了一个 users 数组,当用户尝试登录时,我们会用这个数组来查询已注册用户的凭据。此外,我们使用 'secret' 变量作为演示的 JWT 密钥。
接下来,我们注册了 hapi-auth-jwt2 插件,并创建了一个名为 'jwt' 的认证策略。我们指定了密钥 privateKey,这将用于生成和验证 JWT 签名。validateFunc 函数将在每次请求发送到受保护的路由时调用以进行用户验证。如果找到用户,则将调用传递给它的 callback 函数并返回 true。否则,将返回 false。
在我们的路由配置中,我们添加了一个名为 'auth' 的选项,指定了我们的 JWT 认证策略。这意味着,如果用户未经身份验证尝试访问受保护路由,将会收到 401 Unauthorized 响应。另一方面,如果用户已经通过身份验证,将会收到 'You are authenticated!' 响应。
最后,我们添加了一个名为 '/login' 的路由,用于处理用户登录请求。在这个路由中,我们首先从 request.payload 中获取用户名和密码信息,然后搜索 users 数组来查找相应的用户。如果找到了,我们使用 Jwt.sign 函数来生成 JWT。返回的响应中包含 JWT 令牌,将在后续的请求中用于身份验证。
结论
使用 JWT 流程简单明了,可以实现无状态的身份验证,并可方便地在多个服务底层之间传递。在 Node.js 中,Hapi 提供了强大的且易于使用的插件 hapi-auth-jwt2,使开发人员可以轻松实现 JWT 认证和授权。在本文中,我们介绍了 JWT 的基础知识和 Hapi 中使用 JWT 的示例代码,希望可以帮助您更好地理解和应用 JWT 认证技术。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6774b65c6d66e0f9aaef9196