在 Web 应用开发中,用户验证是一个非常重要的环节。传统的基于 cookie 的验证方式存在一些问题,比如 CSRF(跨站请求伪造)攻击。JWT(JSON Web Token)是一种比较流行的基于 token 的验证方式,它可以解决一些传统验证方式存在的问题,并且具有很好的扩展性和灵活性。本文将介绍如何在 Hapi 框架中使用 JWT 进行用户验证。
什么是 JWT?
JWT 是一种基于 JSON 的 token,它由三部分组成:header、payload 和 signature。header 包含了 token 的类型和加密算法等信息;payload 包含了 token 的内容,比如用户 ID、角色等;signature 是对 header 和 payload 进行加密后的结果,用于验证 token 的真实性。
JWT 的优点在于它可以在服务端生成 token,并将其发送给客户端保存。客户端每次请求时,都需要将 token 发送给服务端进行验证。这样可以避免 CSRF 攻击,并且可以灵活控制 token 的有效期和权限等。
如何在 Hapi 中使用 JWT?
在 Hapi 中使用 JWT 需要安装两个插件:hapi-auth-jwt2
和 jsonwebtoken
。hapi-auth-jwt2
是 Hapi 的一个认证插件,它可以将 JWT 集成到 Hapi 的认证系统中。jsonwebtoken
是 node.js 中用于生成和验证 JWT 的模块。
安装插件:
npm install hapi-auth-jwt2 jsonwebtoken --save
注册插件:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- --- - ------------------------ ----- ------- - -------------------------- ----- ------ - --- ------------- ----- ----- --- ----- -------- - ----- -------- --------- -------- -- - -- -- ----- ---- -- ------- ----- ----- -- -- ------- ------- -- - - -------- --------------- -- -- - -------- ----------- ------------ -- - ----------- ------ - -------- ----- ------------ ------- -- -- ----- ----- - ----- -------- -- - -- ---- ----- ------------------------- -- -- --- -- --------------------------- ------ - ---- ------------------ -- ---- --------- -- ---- -------------- - ----------- --------- -- -- ----------- --- -- -------- --------------------------- -- ----- ----- --------------- ------------------- ------- --- --------------------- -- --------
在上面的代码中,我们首先定义了一个 validate
函数,用于验证 token 是否有效。在该函数中,我们可以根据解密后的 token 内容和当前请求对象进行验证,并返回验证结果和用户信息。然后,我们通过 server.auth.strategy
方法配置 JWT 认证,指定加密密钥、验证函数和验证选项。最后,我们通过 server.auth.default
方法配置默认认证策略为 JWT 认证。
现在,我们可以在路由中使用认证策略了:
-- -------------------- ---- ------- ----- ------ - - - ------- ------ ----- ------------- -------- -------- --------- -- - ------ ------- --------- -------- -- -------- - ----- ------ -- ----- --- -- -- --
在上面的代码中,我们定义了一个 /protected
路由,指定认证策略为 JWT。这样,客户端每次请求该路由时,都需要将 token 发送给服务器进行验证。
如何生成和发送 JWT?
在客户端中,我们可以使用 jsonwebtoken
模块生成和发送 JWT。首先,我们需要使用加密密钥对用户信息进行加密:
const jwt = require('jsonwebtoken'); const user = { id: 123, name: 'Alice' }; const token = jwt.sign(user, 'your-secret-key', { expiresIn: '1h' });
在上面的代码中,我们定义了一个 user
对象,包含了用户 ID 和名称。然后,我们使用 jwt.sign
方法对该对象进行加密,指定加密密钥和有效期。最后,我们得到了一个 token。
接下来,我们可以将该 token 发送给服务器。在请求头中添加 Authorization
字段,值为 Bearer ${token}
:
-- -------------------- ---- ------- ----- ----- - ----------------- ----- ----- - ------------- ----------------------- - -------- - -------------- ------- ---------- -- ---------------- -- - --------------------------- -------------- -- - --------------------- ---
在上面的代码中,我们使用 axios
发送了一个 GET 请求,指定了请求头中的 Authorization
字段为 Bearer ${token}
。这样,服务器就可以使用该 token 进行验证了。
总结
JWT 是一种流行的基于 token 的用户验证方式,可以解决传统验证方式存在的问题,并具有很好的扩展性和灵活性。在 Hapi 框架中,我们可以使用 hapi-auth-jwt2
和 jsonwebtoken
插件实现 JWT 认证。通过认证策略和路由配置,客户端每次请求受保护的路由时都需要发送 token 进行验证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65fb92ced10417a22272736d