在现代 Web 应用开发中,API 服务已经成为了许多应用的核心组成部分。而无状态的 API 服务已经变得越来越流行,因为它们更容易扩展和维护。在这种情况下,使用 JWT(JSON Web Token)作为身份验证和授权机制已经成为了一种主流的方案。在本文中,我们将探讨如何在 Hapi 框架中使用 JWT 实现无状态 API 调用,以及如何在应用中保护敏感数据。
什么是 JWT?
JWT(JSON Web Token)是一个开放标准(RFC 7519),用于在网络应用之间传递声明。JWT 可以通过对 JSON 数据进行加密生成一个安全的字符串,可以被用作身份验证和授权机制。JWT 由三部分组成,分别是 Header、Payload 和 Signature,它们之间使用点号(.)进行分隔。
Header
Header 部分包含了 Token 的元数据,一般包含两个属性:
- alg:指定了 Signature 的算法,可以是 HS256、HS384、HS512、RS256、RS384 或 RS512。
- typ:指定了 Token 的类型,一般为 JWT。
Payload
Payload 部分包含了 Token 的声明,一般包含以下几个属性:
- iss:Token 的发行者。
- sub:Token 的主题。
- exp:Token 的过期时间,必须在当前时间之后。
- nbf:Token 的生效时间,必须在当前时间之后。
- iat:Token 的发行时间。
- jti:针对 Token 的唯一标识符。
还可以添加自定义的声明,称为 Claim。
Signature
Signature 部分使用指定的算法,将 Header 和 Payload 进行加密生成一个哈希值,然后将哈希值加入到 Token 中。服务器可以根据自己的私钥,对 Token 进行验证。这样就可以确保 Token 的真实性。
Hapi 是一个非常流行的 Node.js Web 应用程序框架,通过使用 Hapi,可以方便地实现 API 服务的开发和管理。在 Hapi 中,可以使用 hapi-auth-jwt2 插件来实现 JWT 的身份验证和授权机制。以下是在 Hapi 中使用 JWT 实现无状态 API 调用的详细步骤:
步骤一:安装依赖
首先,需要在项目中安装 hapi-auth-jwt2 和 jsonwebtoken 两个模块。可以使用 npm 命令进行安装:
npm install hapi-auth-jwt2 jsonwebtoken --save
步骤二:创建 JWT 的插件
在 Hapi 中,可以使用插件来扩展框架的功能。因此,我们需要创建一个插件来实现 JWT 的身份验证和授权机制。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- --- - ------------------------ ----- ------ - - ----- ----------- -------- -------- --------- ----- -------- -------- -- - -- ---- --------------------------- ------ - ---- ------------------ ------------- ----- --------- -------- -- - -- --------- ------ - -------- ---- -- -- -------------- - ----------- ---------- -- --- -- ---- -------------- - ------- ------- ----- --------- -------- ----- --------- -- -- - -- ----------------- ----- ----- ----- - ---------- ------- --- -- ------------------- ------ - ----- -- -- -------- - ----- ------ --------- --- -- -- - ------- ------ ----- ---- -------- ----- --------- -- -- - ------ ------- -------- -- -------- - ----- ------ --------- --- -- -- --- -- -- -------------- - -------
在上面的代码中,首先引入了 Hapi 和 jsonwebtoken 模块。然后创建一个 JWT 插件,并使用 server.auth.strategy
方法配置了 JWT 的认证策略。其中,key
属性指定了 JWT 的密钥,validateFunc
属性指定了在进行身份验证的过程中应该执行的函数,verifyOptions
属性指定了加密算法。在这里,我们使用了 HS256
算法。
接下来,使用 server.route
方法添加了两个路由。第一个路由是用于登录验证的,需要在这个路由中进行登录验证,并使用 jwt.sign
方法签发 Token。第二个路由是需要进行身份验证的,需要在这个路由中使用 auth
选项来指定使用 JWT 认证,validate
选项则指定了一个可选的 Joi 验证器,用于验证请求的有效性。如果请求没有通过身份验证,将返回 HTTP 状态码 401 Unauthorized
。
步骤三:注册插件
最后一步是将插件注册到 Hapi 中:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------------- - ----------------------------- ----- ------ - --- ------------- ----- ---- --- ----- ---- - ----- -- -- - ----- ----------------- ------- -------------- -------- - ---------- ------------- -- --- -- -------
在这里,我们引入了之前创建的插件,并将其注册到 Hapi server 中。可以使用 options
属性来设置 JWT 的密钥。
总结
使用 JWT 实现无状态 API 调用是一种流行的方案,可以避免使用传统的 Cookie 机制带来的一些问题。在 Hapi 框架中,可以使用 hapi-auth-jwt2 插件来实现 JWT 的身份验证和授权机制。在使用这个插件的过程中,需要创建一个 JWT 插件,并将其注册到 Hapi server 中。希望本文能够帮助你了解如何在 Hapi 中使用 JWT,同时也可以为你在实际开发中提供一些参考。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651c098d95b1f8cacd39d7bd