在 Web 应用程序中,对用户进行身份验证和授权是一项核心功能。JWT 是一种标准化的身份验证和授权方法,可以用于跨域场景和个人用户的 Web 访问授权。Hapi 框架是一个基于 Node.js 的 Web 开发框架,可以方便地构建 Web 应用程序。在本文中,我们将介绍如何在 Hapi 框架中使用 JWT 进行用户认证。
什么是 JWT?
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息,可以用于授权和身份验证。JWT 通常由三部分组成:头部、负载以及签名。头部通常包括声明的类型(JWT)和算法(例如 HMAC SHA256)的声明。负载包含声明,这些声明表示某些实体(通常是用户)和其他元数据。签名对头部和负载进行加密,以防止被篡改。
使用 Hapi 框架实现用户认证
基于 JWT 实现用户认证需要进行以下几个步骤:
- 认证用户并生成 JWT
- 验证 JWT
- 在 Hapi 路由中使用 JWT 保护路由
1. 认证用户并生成 JWT
在 Hapi 框架中,通常使用 hapi-auth-jwt2
插件来处理 JWT 认证。首先需要安装该插件:
npm install hapi-auth-jwt2
接下来,在 Hapi 服务器实例中注册该插件:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- --- - -------------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------ - ----- --------- -------- -- -- - -- ------- --- --- -- ----- ----- - ----- -- -- - ----- --------------------- --------------------------- ------ - ---- ---------------- -- ------ --- --------- ------------------- -- -- --- --- -------------- - ----------- - ------- - - -- --- ---- --- -
这里需要编写 validationFunction
函数来实现验证 JWT 的逻辑。该函数接收三个参数:decoded
(解码后的 JWT 负载)、request
(来自客户端的请求)和 h
(回复工具包)。该函数应该检查 JWT 的凭证,例如,检查用户是否存在、用户的权限等等,并返回 { isValid: true }
或者 { isValid: false }
。
当用户进行登录时,负责生成 JWT 的路由处理程序应该如下所示:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------------ - ----- --------- -- -- - ----- - --------- -------- - - ---------------- -- ------ ----- ---- - ----- -------------------------- ---------- -- -- --- ----- ----- - ---------- --- -------- ----- ------------- -- ---------------- - ---------- ---- --- ------ ------------ ----- --- --
2. 验证 JWT
验证 JWT 的逻辑已经在 validationFunction
函数中实现。 validationFunction
接收解码后的 JWT 负荷作为第一个参数,并且应该返回一个包含 isValid
属性的对象,表示 JWT 是否有效:
const validationFunction = async (decoded, request, h) => { const user = await getUserById(decoded.id); if (!user) return { isValid: false }; return { isValid: true, credentials: { ...decoded, user } }; };
在这个例子中,我们获取了 JWT 解码后的 ID 属性,并使用其作为参数来查询用户。如果找到了与 JWT 对应的用户,我们将返回一个包含 isValid: true
属性的对象。我们还可以在 credentials
属性中设置 JWT 的负载,以供进一步的路由处理时使用。
3. 在 Hapi 路由中使用 JWT 保护路由
完成以上步骤后,我们可以使用 hapi-auth-jwt2
插件来保护某些路由,以确保只有验证过的用户才能访问该路由。在 Hapi 框架中,使用 auth
选项来声明此类路由:
-- -------------------- ---- ------- ----- ----------- - --------- -- -- - ----- - ---- - - ------------------------- ------ ------------ ---- --- - ----- ------ - - - ------- ------- ----- --------- -------- ------------ -- - ------- ------ ----- -------- -------- ------------ -------- - ----- ----- - - -- ---------------------
在这个例子中,我们通过在路由选项中设置 auth: 'jwt'
来保护 /user
路由。它只有在请求在头部包含 Authorization
属性,并带有有效的 JWT 时才会被执行。
总结
在本篇文章中,我们介绍了如何在 Hapi 框架中使用 JWT 进行用户认证。我们讨论了如何生成和验证 JWT,并演示了如何使用 Hapi 路由中的 auth
选项来保护路由。JWT 提供了一个灵活的、安全的机制,可用于保护用户数据和 Web 应用程序的动态内容。我们希望本文对于您了解 JWT 在 Hapi 框架中的使用有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ec10d0f6b2d6eab365cb0f