在现代 Web 应用程序中,身份验证是必不可少的。JSON Web Token (JWT) 是一种流行的身份验证方法,它允许在客户端和服务器之间安全地传递身份验证信息。在本文中,我们将介绍如何使用 Hapi 框架来实现 JWT 身份验证。
什么是 JWT?
JSON Web Token (JWT) 是一种开放标准,它定义了一种紧凑且自包含的方式来在网络上安全地传输信息。JWT 是由三部分组成:头部、载荷和签名。
头部包含了 JWT 的类型和使用的算法,例如:
{ "alg": "HS256", "typ": "JWT" }
载荷包含了需要传输的信息,例如用户 ID 和过期时间等:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022, "exp": 1516239122 }
签名是使用头部中指定的算法对头部和载荷进行加密得到的结果。签名可以用来验证 JWT 的完整性和真实性。
Hapi 框架
Hapi 是一个现代化的 Node.js Web 框架,它提供了一些强大的功能,例如路由、插件和身份验证等。Hapi 的设计目标是提供一个可扩展、可维护和易于测试的框架。
实现 JWT 身份验证
下面是一个使用 Hapi 实现 JWT 身份验证的示例代码。
安装依赖
首先,我们需要安装一些依赖:
npm install hapi joi jsonwebtoken hapi-auth-jwt2
hapi
是 Hapi 框架本身。joi
是一个数据验证库,用于验证请求中的数据。jsonwebtoken
是一个用于生成和验证 JWT 的库。hapi-auth-jwt2
是一个 Hapi 插件,用于实现 JWT 身份验证。
创建服务器
接下来,我们需要创建一个 Hapi 服务器,并配置一些基本设置,例如端口号和路由。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ ------- -------- - --- ----- -------- ------- - ----- --------------- ------------------- ------- --- --------------------- - --------展开代码
在上面的代码中,我们创建了一个 Hapi 服务器,并定义了一个路由,它将发送一个简单的文本响应。
配置身份验证
现在,我们需要配置 Hapi 身份验证插件,以便我们可以使用 JWT 身份验证。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- --- - --------------- ----- --- - ------------------------ ----- ------- - -------------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ ------- -------- - --- ----- -------- - ----- --------- -------- -- -- - -- ----- ----- ---- ------ - -------- ---- -- -- ----- ---- - ----- -- -- - ----- ------------------------- --------------------------- ------ - ---- --------- -- --------- --------- -- ---- -------------- - ----------- --------- - -- ---- --- --------------------------- -- ------- ----- -------- ------- - ----- --------------- ------------------- ------- --- --------------------- - --------展开代码
在上面的代码中,我们使用 hapi-auth-jwt2
插件来实现 JWT 身份验证。我们定义了一个名为 validate
的验证函数,它将在每个请求中使用。在这个函数中,我们可以验证 JWT 是否有效,并将验证结果返回给 Hapi。
我们还使用 server.auth.strategy
方法来定义身份验证策略。我们将其命名为 jwt
,并使用 jwt
方案来指定我们要使用 JWT 身份验证。我们还提供了一个签名密钥和一些验证选项。
最后,我们使用 server.auth.default
方法来指定默认的身份验证策略。这意味着所有的路由都将使用 JWT 身份验证。
添加路由和控制器
现在,我们可以添加一些需要身份验证的路由和控制器。
-- -------------------- ---- ------- -------------- ------- ------- ----- --------- -------- - ----- ------ --------- - -------- ------------ --------- -------------------------------------------------- --------- ----------------------- -- - -- -------- ----- --------- -- -- - ----- - --------- -------- - - ---------------- -- --------------- ----- ----- - ---------- -------- -- --------- - ---------- ---- --- ------ - ----- -- - --- -------------- ------- ------ ----- ----------- -------- --------- -- -- - ------ --------- --------------------------------------- - ---展开代码
在上面的代码中,我们添加了两个路由和控制器。第一个路由是 /login
,它用于验证用户名和密码,并返回一个 JWT。我们在路由选项中使用 auth: false
,因为我们不需要身份验证来登录。我们还使用 validate
选项来验证请求中的数据。
第二个路由是 /profile
,它需要身份验证才能访问。我们在控制器中使用 request.auth.credentials.username
来获取当前用户的用户名。
到目前为止,我们已经成功地实现了 JWT 身份验证。现在我们可以使用 Postman 或其他工具来测试我们的 API。
总结
在本文中,我们介绍了 JWT 身份验证和 Hapi 框架,并使用示例代码演示了如何在 Hapi 中实现 JWT 身份验证。我们希望这篇文章能够帮助你更好地理解 JWT 身份验证和 Hapi 框架,并在实际项目中使用它们。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/657f17ced2f5e1655d9f62be