在进行 API 设计时,经常需要控制接口的存活时间,以便确保接口不会被恶意攻击者滥用。一种常见的解决方案是使用 JWT(JSON Web Token)技术,它可以让我们通过签发和验证 token 来管理接口的访问权限,从而控制其生命周期。
Hapi Auth Jwt 是 Hapi 框架的一个插件,它提供了 JWT 认证和授权机制,可以方便地对发送请求的用户进行身份验证和权限管理。在本文中,我们将介绍如何使用 Hapi Auth Jwt 实现 API 请求后接口的存活时间管理。
安装 Hapi Auth Jwt
在开始之前,我们需要先安装 Hapi 框架和 Hapi Auth Jwt 插件。可以使用 npm 命令进行安装:
npm install hapi hapi-auth-jwt
生成 JWT Token
使用 Hapi Auth Jwt 生成 JWT Token 可以使用以下代码:
const Jwt = require('jsonwebtoken'); const createToken = (payload, secret, expiresIn) => { return Jwt.sign(payload, secret, {expiresIn: expiresIn}); };
其中,payload 是要包含在 token 中的数据,secret 是加密密钥,expiresIn 是 token 的有效期。
在实际应用中,可以根据不同的需求设置不同的有效期,例如:
- 如果需要长期有效的 token,可以将 expiresIn 设置为 7 天或更长时间。
- 如果需要较短有效期的 token,可以将 expiresIn 设置为较短时间,例如 10 分钟。
验证 JWT Token
接收带着 JWT Token 的请求时,我们需要首先对 Token 进行验证。
使用 Hapi Auth Jwt 验证 JWT Token 可以使用以下代码:
-- -------------------- ---- ------- ----- ----------- - ------- ------- -- - ------ --- ----------------- ------- -- - ----------------- ------- ----- -------- -- - -- ----- - ------------ - ---- - ----------------- - --- --- --
其中,token 是接收到的 token,secret 是加密密钥。如果验证成功,该函数会返回一个解密后的数据对象 decoded。如果验证失败,该函数会抛出异常。
注册 Hapi Auth Jwt 插件
在使用 Hapi Auth Jwt 插件之前,我们需要先注册它。
以下是一个简单插件的代码:
-- -------------------- ---- ------- ----- ------- - ------------------------- ----- ------------ - ----------------------------- ----- ------ - - ----- --------------------- -------- -------- --------- ----- -------- -------- -------- - ----- ------------------------- --------------------------- ------ - ---- --------------- --------- ------------- -------------- - ----------- --------- - --- --------------------------- - -- -------------- - -------
这个插件使用了 validateUser 函数来实现用户的验证。这个函数需要我们自己实现。我们可以在这个函数中实现用户是否合法、用户是否有权限访问该接口等验证逻辑。我们可以参考以下代码:
-- -------------------- ---- ------- ----- ----- - - ------ - --- ---- ----- -------- --------- ------------ -- -- ----- ------------ - ----- --------- -------- -- -- - ----- - -------- - - -------- ----- ---- - ---------------- -- ------- - ------ - -------- ----- -- - ------------ - ----- ------ - -------- ---- -- -- -------------- - -------------
这个函数假设我们已经事先定义了名为 users 的用户数据库,其中包含了管理员账户的信息。
在这个函数中,我们通过解密 token 获得用户的信息,然后从 users 数据库中根据用户名获取用户信息。如果用户不存在,则返回一个验证失败的结果;否则,将用户信息存储到 request 对象中,以便在接口中使用。
使用 Hapi Auth Jwt 管理接口的生命周期
有了上述基础,我们已经可以使用 Hapi Auth Jwt 插件管理接口的生命周期了。
以下是一个完整的例子:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------ - ----------------------------------- ----- ----------- - ---------------------------- ----- ----------- - ---------------------------- ----- ------ - --- ------------- ----- ----- ----- ----------- --- ----- ----- - - ------ - --- ---- ----- -------- --------- ------------ -- -- ----- ------------ - ----- --------- -------- -- -- - ----- - -------- - - -------- ----- ---- - ---------------- -- ------- - ------ - -------- ----- -- - ------------ - ----- ------ - -------- ---- -- -- -------------- ------- ------ ----- --------- -------- --------- -- -- - ------ ------- -------- -- -------- - ----- ----- - --- -------------- ------- ------- ----- --------- -------- --------- -- -- - ----- - --------- -------- - - ---------------- ----- ---- - ---------------- -- ------ -- ------------- --- --------- - ------ ------------ ------ -------- ------------ ------------- - ----- ----- - ------------- -------- -- -------------- ------- ------ - ----- -- - --- ----- ----- - ----- -- -- - --- - ----- ----------------------- - ------- ------------- --- ----- --------------- - ----- ----- - ----------------- ---------------- - ------------------- ------- ----- ----------------- -- --------
在这个例子中,我们定义了两个接口:GET /hello
和 POST /login
。
GET /hello
接口需要进行 JWT 认证后才能访问。通过设置options.auth: 'jwt'
来实现。POST /login
接口用于登录,并返回一个包含 JWT Token 的响应。
现在我们可以运行这个程序并进行测试,以验证接口的访问权限和生命周期是否符合预期。
curl -X GET http://localhost:3000/hello
这个请求应该会被拒绝,因为我们没有提供 Token。
curl -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "admin1234"}' http://localhost:3000/login
这个请求应该会返回一个包含 token 的响应。
curl -X GET -H "Authorization: Bearer <token>" http://localhost:3000/hello
这个请求应该会返回 Hello, World!
,因为我们提供了 token 并通过了验证。
总结
在本文中,我们介绍了如何使用 Hapi Auth Jwt 实现 API 请求后接口的存活时间管理。通过 JWT 认证和授权机制,我们可以方便地对发送请求的用户进行身份验证和权限管理。使用 Hapi Auth Jwt 插件可以更加方便地实现这一过程,并提高接口的安全性和生命周期管理的精度。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647d92d3968c7c53b085c371