在现代 Web 应用程序中,API 是不可或缺的一部分。然而,如何保护这些 API 则变得至关重要,因为它们可能包含受保护的信息或仅供授权用户使用。在本文中,我们将讨论如何使用 Hapi 和 JWT 保护 API。
什么是 Hapi 和 JWT?
Hapi 是一个用于构建 Web 应用程序和服务的 Node.js 框架。它是一个有扩展性和插件化的框架,可以让你快速构建和扩展 Web 应用程序。Hapi 提供了路由,请求和响应处理,缓存,身份验证等重要功能。
JSON Web Token (JWT)是一种用于安全地传输信息的开放标准。JWT 通常用于在客户端和服务器之间传输用户身份信息。它包含一个加密的 JSON 对象,可以被验证和解码以获得信息。
步骤1:安装和配置 Hapi
首先,我们要确保安装了 Hapi。可以使用以下命令来进行安装:
--- ------- ----------
接下来,我们需要创建一个 Hapi 实例并为其配置路由。以下是一个简单的示例:
----- ---- - ---------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ ------- -------- - --- ----- -------- ------- - ----- --------------- ------------------- ------- -- --------------------- - --------
以上代码会创建一个在本地 3000 端口上运行的 Hapi 服务器,它将处理根路径的 GET 请求并返回 Hello, World!
。
步骤2:安装和使用 JWT
接下来,我们需要安装 JWT。可以使用以下命令来进行安装:
--- ------- ------------
我们将使用 jsonwebtoken
模块来生成和验证 JWT。以下是一个生成 JWT 的示例:
----- --- - ------------------------ ----- ------- - - --------- ------- -- ----- ------ - ----------- ----- ----- - ----------------- ------- - ---------- ---- --- -------------------
以上代码会使用 jsonwebtoken
模块生成一个带有 payload 和过期时间的 JWT。注意,我们向 jwt.sign()
函数传递了一个密钥参数 secret
,这是用于对 JWT 进行签名的加密密钥。这个密钥应该是保密的,并只被服务器知道。
接下来,我们将编写一个函数来验证 JWT:
----- -------- --------------- ------- - ------ --- ----------------- ------- -- - ----------------- ------- ----- -------- -- - -- ----- ------ ------------ ----------------- --- --- - ----- ----- - ------------------------------------------------------------------------------------------------------------------------------------------------------------ ----- ------ - ----------- --------------- ------- ------------- -- --------------------- ---------- -- --------------------
以上代码会使用 jsonwebtoken
模块验证 JWT 并解码标头,负载和签名。如果解码成功,则会返回解码后的对象,否则会抛出一个错误。请注意,我们将 jwt.verify()
函数包装在一个 Promise 中,以便我们可以使用 async/await 调用它。
步骤3:保护 API 并验证 JWT
现在我们已经安装和配置了 Hapi 和 JWT,我们可以开始保护我们的 API 了。为此,我们将使用 Hapi 的插件系统。以下是一个示例插件:
----- -------- ------------------ -------- - ----- -------- - ----- --------- -------- -- - -- ----- --- ------------ ------ - -------- ---- -- -- ----- ------------------------------------------------- --------------------------- ------ - ---- --------------- --------- -------------- - ----------- --------- - --- --------------------------- - ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ ----- ------------- -------- - ----- ----- -- -------- --------- -- -- - ------ ---------- ----- - --- ----- ----------------- ------- ----------- -------- - ------- ---------- - --- ----- --------------- ------------------- ------- -- --------------------- -- -------
以上代码包含一个插件,它注册了 @hapi/hapi-auth-jwt2
插件并配置了 jwt
策略来验证 JWT。我们定义了一个 validate()
函数,在函数中验证了 JWT,并检查了用户是否有访问权限。实际上,这非常简单,仅仅完成了一个响应是否是有效的 JWT 的检查。在真实的应用程序中,应该在此处添加更多的安全措施和身份验证逻辑。
然后我们定义了一个 /protected
路由,并将 auth
选项设置为 jwt
,这表明路由必须使用 JWT 进行验证。从而,只有在请求传递了有效的 JWT 的情况下,才会返回「Protected API」字符串。
最后,我们将 authPlugin
插件注册到服务器上,并向其传递一个选项,包含用于生成和验证 JWT 的密钥。
结论
到此,我们已经学习了如何使用 Hapi 和 JWT 保护 API。我们首先安装和配置了 Hapi 和 JWT,然后编写了验证 JWT 的函数,最后使用 Hapi 的插件系统保护了我们的 API。
当然,本文中只是给出了一个简单的示例来说明如何使用 JWT 和 Hapi,我们应该在实际应用程序中添加更多的安全措施和身份验证逻辑。
如果你想在你的应用程序中使用 Hapi 和 JWT,可以使用以上示例作为起点。祝你好运!
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66f3a728f40ec5a964e40832