前言
在构建 Web 应用程序时,身份验证是一个必不可少的功能,以保护用户的数据和安全。JSON Web Token(JWT)是一个流行的身份验证标准,它允许安全中继信息,而无需在每个请求中进行身份验证。Fastify 是一个快速和低开销的 Web 框架,它提供了一个用于处理 HTTP 请求的插件体系结构。在本文中,我们将使用 Fastify 和相应的插件来搭建一个基于 JWT 的身份验证系统。
快速上手
在开始之前,请确保您已经安装了 Node.js,并已经对 Fastify 有一个基本的了解。接下来,我们将介绍如何使用 Fastify-jwt 插件来搭建 JWT 身份验证系统。
安装依赖
npm install fastify fastify-jwt
初始化 Fastify 应用
const fastify = require('fastify')() fastify.listen(3000, (err, address) => { if (err) throw err console.log(`server listening on ${address}`) })
添加 JWT 插件和配置
// javascriptcn.com 代码示例 const fastifyJWT = require('fastify-jwt') fastify.register(fastifyJWT, { secret: 'supersecret' }) fastify.decorate('authenticate', async (request, reply) => { try { await request.jwtVerify() } catch (err) { reply.send(err) } })
这里我们使用了 fastify-jwt
插件,它提供了 jwtSign
和 jwtVerify
方法来生成和验证 JWT。我们使用 fastify.decorate
方法为 Fastify 实例添加了一个 authenticate
方法,用于验证用户的身份。
添加路由和控制器
// javascriptcn.com 代码示例 fastify.post('/login', async (request, reply) => { const { username, password } = request.body // 校验用户信息 const user = await getUserFromDb(username, password) if (!user) { return reply.status(401).send({ message: 'Invalid credentials' }) } // 生成 JWT const token = await reply.jwtSign({ sub: user.id }) reply.send({ token }) }) fastify.get('/profile', { preValidation: [fastify.authenticate] }, async (request, reply) => { // 验证成功,返回用户信息 const user = await getUserFromDbById(request.user.id) reply.send(user) })
这里我们添加了两个路由,一个用于用户登录,另一个用于获取用户信息。在登录路由处理程序中,我们校验用户提供的用户名和密码,并在成功后生成 JWT 并将其发送回客户端。在获取用户信息的路由处理程序中,我们使用 { preValidation: [fastify.authenticate] }
选项来告诉 Fastify 在处理请求之前验证 JWT。
灵活使用
除了基本用法之外,Fastify-jwt 插件还提供了一些其他的选项和方法,可以提高 JWT 的灵活性和安全性。下面是一些常用的选项:
Expire
fastify.register(fastifyJWT, { secret: 'supersecret', sign: { expiresIn: '10m' } })
使用 sign.expiresIn
选项可以设置 JWT 的过期时间。在上面的示例中,我们将 JWT 的过期时间设置为 10 分钟。过期后,JWT 将无效并且需要重新生成。
Audience and Issuer
fastify.register(fastifyJWT, { secret: 'supersecret', sign: { audience: 'my-audience', issuer: 'my-issuer' } })
通过 sign.audience
和 sign.issuer
可以设置 JWT 的受众和发行者。这些选项有助于确保 JWT 可信且不被滥用。
Verify
await request.jwtVerify({ audience: ['my-audience'] })
使用 request.jwtVerify
方法并提供选项可以验证 JWT 的有效性。在上面的示例中,我们使用 audience
选项来验证 JWT 的受众。如果 JWT 的受众与提供的受众不匹配,则验证失败。
总结
本文介绍了如何使用 Fastify-jwt 插件快速搭建基于 JWT 的身份验证系统。我们了解了如何使用 Fastify-jwt 插件中的基本选项和方法,并使用示例代码说明了如何将其应用于实际场景。JWT 身份验证系统是保护 Web 应用程序安全的常用方式之一,而 Fastify 提供了一个简单且高效的方法来处理 HTTP 请求。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654481657d4982a6ebe5addb