在开发 Web 应用过程中,用户认证和资源访问控制是不可避免的问题,而 JWT(JSON Web Token) 是一种常用的认证方案。本文将介绍如何在 Hapi 框架中使用 JWT 进行请求身份验证。
JWT 简介
JWT(JSON Web Token) 是一种开放标准,用于通过网络传递信息,主要用于身份认证和授权。JWT 由三部分组成,分别是 Header,Payload 和 Signature。
Header 部分通常由两部分组成,分别是 token 类型和算法类型,比如:
{ "alg": "HS256", "typ": "JWT" }
Payload 部分是实际的用户数据,比如用户 id,用户名等等,也可以自定义一些其它数据,比如用户权限等等,比如:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
Signature 部分则是对 Header 和 Payload 进行签名后的结果,用于验证数据的完整性和真实性,比如:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
Hapi 实现 JWT 身份验证
在 Hapi 中使用 JWT 身份验证主要分为两步,第一步是生成 JWT token,第二步是验证 JWT token 的有效性。
生成 JWT token
在 Hapi 中生成 JWT token 可以使用 jsonwebtoken
这个 npm 包。我们可以在路由处理函数中生成 token,然后将 token 通过响应返回给客户端:
-- -------------------- ---- ------- ----- --- - ----------------------- ----- ------- - --------- -- -- - ----- ------ - -------- ----- ----- - ---------- ------ -- ---------------------- - ---------- ---- -- ------ - ----- - - ----- ------ - -- ------- ------ ----- ---- ------- --
以上代码使用了 jsonwebtoken
包中的 sign
方法生成 JWT token,包含用户 id 信息,并且设置了一个过期时间为 1 小时。生成的 token 可以通过响应返回给客户端,客户端在后续的请求中携带 token 访问服务端资源。
验证 JWT token
验证 JWT token 的有效性可以使用 Hapi 中的 Authentication 插件并结合 jsonwebtoken
包。
首先,我们需要安装并注册 hapi-auth-jwt2
插件:
-- -------------------- ---- ------- ----- ---- - --------------------- ----- ----------- - ------------------------- ----- ---- - ----- -- -- - ----- ------ - ------------- ----- ----- ----- ----------- -- ----- ---------------------------- --------------------------- ------ - ---- ---------------------- --------- --------- -------- -- -- - -- ----------------- - ------ - -------- ----- - - ------ - -------- ---- - -- -------------- - ----------- --------- - -- -------------------------- -- ------ ---- -
以上代码使用了 hapi-auth-jwt2
插件,并且使用 server.auth.strategy
方法注册一个名为 jwt 的策略。该策略包含了一个验证回调函数,用于验证 token 中解码出来的用户 id 是否存在,如果存在则认为验证成功。如果验证失败,可以通过返回一个包含 isValid 为 false 的对象来表示。
我们还通过 server.auth.default
方法将默认的认证策略设置为 jwt 策略,这样所有的请求都会经过 jwt 验证。
最后,我们可以在路由配置中指定需要认证的路由,可以使用 config.auth
属性来指定需要使用的认证策略,比如:
-- -------------------- ---- ------- ----- ------ - - - ------- ------ ----- ---- -------- ------- - ----- ----- - - -
以上代码指定了根路径的 GET 请求需要进行 jwt 认证,当请求到达服务器端时,Hapi 就会通过指定的验证策略对请求进行验证,如果验证失败则返回一个 401 错误,否则继续进行后续的路由处理。
总结
本文介绍了如何在 Hapi 框架中使用 JWT 进行请求身份验证。我们首先了解了 JWT 的基本概念和组成结构,然后通过示例代码演示了如何生成和验证 JWT token,最后给出了如何在路由配置中指定需要使用的认证策略。这些内容对于 Web 应用中的用户认证和资源访问控制都是非常有帮助和指导意义的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d4a3cfb5eee0b525c3c2b8