身份验证是现今 Web 开发中必不可少的一项安全性措施,而 Hapi 框架作为现今流行的 Node.js Web 框架之一,也提供了一系列的身份验证机制。其中,hapi-auth-jwt2 是一个相当强大的身份验证插件,支持 JSON Web Token(JWT)。
JWT 简介
JSON Web Token(JWT)是一种用于安全传输信息的开放标准(RFC 7519)。它通常由三部分组成:头部、有效负载和签名。
- 头部:一般规定了使用 JWT 的算法及其他元数据。
- 有效负载:通常包含了用户信息等相关数据。
- 签名:将头部和有效负载用一定的算法(如 HMAC)签署起来,以防信息被篡改。
JWT 的优点在于它不需要使用服务器端保存 session,使得 JWT 能够适用于分布式系统或者前后端分离的情况。
hapi-auth-jwt2 简介
hapi-auth-jwt2 是一个用于 Hapi 框架的 JWT 身份验证插件。它提供了以下的安全特性:
- 颁发、验证 JWT
- 缓存非法 JWT
- 实时撤销 JWT
- 记录日志并生成审计记录
本文将结合示例代码,详细介绍 hapi-auth-jwt2 如何使用。
使用步骤
安装 hapi-auth-jwt2
在使用 hapi-auth-jwt2 前,需要在项目中安装 hapi-auth-jwt2 模块。
npm install hapi-auth-jwt2 --save
注册 hapi-auth-jwt2 插件
在注册 hapi-auth-jwt2 插件时,需要先定义一个策略。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------- - -------------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ---- - ----- -- -- - -- ------ ----- ------------------------- --------------------------- ------ - ---- ----------------------- --------- --------- -------- -- -- - ---------------- -------- ---- ------ --------------------- ------ - -------- ---- -- -- -------------- - ----------- --------- - --- -- ---- -- -------
在这段代码中,我们注册了 hapi-auth-jwt2 插件,并定义了一个名为 jwt
的认证策略。在该认证策略中,我们指定了 JWT 的属性:密码键 key
,有效载荷的解码函数 validate
和验证 JWT 的算法 verifyOptions
。
应用认证策略
经过以上操作,在服务器上定义了一个策略。但是,并不是所有的路由都需要使用该策略。需要在需要访问受限资源的路由上应用该策略。
-- -------------------- ---- ------- -------------- ------- ------ ----- -------------- -------- - ----- ------ -- ------- -------- --------- -- -- - ------ ------------- - - ---
在该代码片段中,我们定义了一个 GET /restricted
的路由,并应用了上面定义的 jwt
认证策略。这意味着,用户必须在请求头中携带 JWT 以访问该路由。
JWT 颁发
在用户的登录顺利完成后,服务器需要颁发一个符合规范的 JWT 给客户端以便后续访问。在颁发 JWT 时,建议在其中设置一个有效期,使得无人接触的 JWT 在一定时间内自动失效,防止攻击者利用过期的 JWT 访问受保护的路由。
const Jwt = require('jsonwebtoken'); // 生成 JWT const token = Jwt.sign({ username: 'tom' }, 'NeverShareYourSecret', { expiresIn: '1h' });
上面的代码中,我们使用 jsonwebtoken
模块发放 JWT。在颁发 JWT 中添加了受浪费路径的有效期。
JWT 解码
一旦客户端使用 JWT 成功访问了一个受限的路由,服务器需要检验 JWT 是否是合法的。在检验过程中,需要对 JWT 进行解码操作。这可以通过调用 verifyJwt
方法:
-- -------------------- ---- ------- ----- --------- - ----------------------- ----- --------- - --------- -------- -- -- - -- ----------------- --- ------ - ------ - -------- ---- -- - ------ - -------- ----- -- -- ----- ----------- - ------------------------ -- -- --- ----------------------- ---------- - ----------- --------- -- ----- -------- -- - -- ----- - ---------------- ---- ------ - ---- - ---------------- ---- ------ ------------------------------ -- -- --- ------------------------- -- ------ ------------------------- -- ------ - ---
在这段代码中,我们使用 jsonwebtoken
模块验证了 JWT,并且成功地解码了其中的有效负载。解码操作会返回一个对象,其中包含了 JWT 中的有效属性以及签发时间和过期时间。
总结
hapi-auth-jwt2 插件为我们的 Web 应用程序提供了方便、强大的身份验证机制,并且减少了应用程序状态维护的开销。本文详细介绍了使用 hapi-auth-jwt2 的完整过程。希望读者们能够从本文中学到 something new 并启发到自己的实践。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f185e1f6b2d6eab3b56e21