JWT 简介
JSON Web Token (JWT) 是一种基于 JSON 格式的轻量级身份验证和授权方案。JWT 由三部分组成:头部(Header)、载荷(Payload)以及签名(Signature)。其主要功能是用于在用户和服务器之间传递安全可靠的信息。
JWT 采用 Base64 编码算法对 Payload 和 Header 进行编码,并采用盐值加密算法对编码后的 Payload 和 Header 进行签名,从而保证 JWT 数据传输过程中的安全性。
Fastify 简介
Fastify 是一个快速且低开销的 Web 框架,用于构建高效的 Node.js 服务端应用。它拥有精简的核心功能,却支持插件式的扩展,可以根据需求随意增添所需功能。
Fastify 具有如下特点:
- 高性能、低内存占用;
- 轻量级、易于使用;
- 可扩展、插件式设计;
- 好维护、易扩展。
在 Fastify 中使用 JWT
在 Fastify 中使用 JWT 进行认证授权,主要分为如下几个步骤:
- 安装相关依赖:
fastify-jwt
、jsonwebtoken
。 - 初始化 Fastify 实例时,注册
fastify-jwt
插件。 - 配置 JWT 相关参数:加密算法、秘钥、过期时间等。
- 编写认证接口,返回 JWT Token。
- 编写验证接口,使用
fastify-jwt
插件进行认证。
下面将分别详细介绍这几个步骤。
安装相关依赖
我们可以使用 npm
命令来安装所需的依赖:
npm install --save fastify-jwt jsonwebtoken
注册 fastify-jwt
插件
在 Fastify 实例初始化时,需要注册 fastify-jwt
插件:
const fastify = require('fastify')() fastify.register(require('fastify-jwt'), { secret: 'supersecret' })
如上代码所示,在插件初始化时,需要指定 JWT 相关参数,包括 secret
(秘钥)、加密算法(默认为HS256
)、过期时间(默认为 15 分钟)等。这些参数将在后续的编写中用到。
配置 JWT 相关参数
在以上代码示例中,我们通过 register
方法注册了 fastify-jwt
插件,并指定了 secret
秘钥。秘钥是采用盐值加密算法对 JWT 进行签名的必要参数,需要我们在实际使用中自己设置,一般建议将其设置为复杂的字符串,例如:
fastify.register(require('fastify-jwt'), { secret: 'my-complex-secret' })
同时,我们还可以根据需求指定加密算法(algorithm
)和过期时间(expiresIn
)等配置参数,如下示例:
fastify.register(require('fastify-jwt'), { secret: 'my-complex-secret', algorithm: 'HS384', expiresIn: '1h' })
使用以上配置,我们将采用 HS384
加密算法进行签名,JWT Token 的过期时间为 1 小时。
编写认证接口
在进行 JWT 认证时,我们需要编写一个认证接口,通过该接口返回 JWT Token 给客户端。
下面是一个简单的认证接口示例:
-- -------------------- ---- ------- ---------------------- ----- --------- ------ -- - ----- - --------- -------- - - ------------ -- ----------- ----- ---- - ----- --------------------------- --------- -- ----------- --- ----- ------- -- ------ - ----- ----- - ------------------ ---- -------- -- ------------ ----- -- - ---- - -- ------- --- --- ---------------------- ------ -------- -------- -- --------- -- - --
在上述代码中,我们首先对客户端提交的用户信息进行认证,如果认证成功,我们将该用户的 uid 信息打包生成 JWT Token,并以 JSON 格式返回给客户端。
编写验证接口
在进行 JWT 验证时,我们需要编写一个验证接口,客户端在每次请求需要验证的接口时,都必须在请求头中携带正确的 JWT Token 才能通过认证。下面是一个 JWT 验证接口示例:
fastify.get('/protected', { preValidation: fastify.authenticate }, async (request, reply) => { const user = await User.query().findById(request.user.uid) reply.send({ message: `Hello, ${user.name}` }) })
在上述代码中,我们使用了 Fastify 中的 preValidation
钩子来对请求进行验证,验证通过后,请求才会被进一步处理。如果请求头中携带的 JWT Token 不正确或已过期,则会返回 401 错误码。
总结
使用 Fastify 进行 JWT 认证和授权是一种简单易用的方案,将用户和服务端间的信任关系降至最低,从而保证数据传输的安全和可靠性。在开发实践中,我们需要根据具体需求,适时地配置 JWT 相关参数,并编写认证和验证接口,从而构建出具有高可靠性和安全性的 Node.js 服务端应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65002a7c95b1f8cacde5c851