前言
在现代 web 应用程序中,身份认证是必不可少的一个组成部分。JWT(JSON Web Token)是一种用于认证和授权的开放标准,它使用 JSON 对象来安全地传输信息。在本文中,我们将介绍如何在 Fastify 框架中使用 JWT 身份认证。
什么是 Fastify?
Fastify 是一个快速、低开销、可扩展的 Node.js Web 框架。它专注于提供最佳性能,并且易于学习和使用。Fastify 的设计目标是提供高性能的路由和中间件,以及易于扩展的插件系统。
什么是 JWT?
JWT 是一种开放标准,用于安全地在两个实体之间传输信息。它是一个 JSON 对象,包含了一些元数据和用户信息。JWT 包含三部分:头部、载荷和签名。头部包含了算法和类型信息,载荷包含了用户信息,签名用于验证 JWT 的真实性。
如何在 Fastify 中使用 JWT?
在 Fastify 中使用 JWT 需要安装两个 npm 包:jsonwebtoken
和 fastify-jwt
。jsonwebtoken
用于生成和验证 JWT,fastify-jwt
用于在 Fastify 中集成 JWT。
安装依赖
npm install jsonwebtoken fastify-jwt
配置 JWT
在 Fastify 应用程序中配置 JWT 需要指定一个密钥和一些选项。密钥用于签名 JWT,选项包括算法、过期时间和默认的签名有效期。
// javascriptcn.com 代码示例 const fastify = require('fastify')() fastify.register(require('fastify-jwt'), { secret: 'my-secret-key', algorithms: ['HS256'], expiresIn: '1h', notBefore: '2m', audience: 'my-audience', issuer: 'my-issuer' })
生成 JWT
在 Fastify 中生成 JWT 需要使用 fastify.jwt.sign
方法。该方法接受一个 JSON 对象和一些选项,使用指定的密钥生成 JWT。
// javascriptcn.com 代码示例 fastify.post('/login', async (request, reply) => { const { username, password } = request.body // Check username and password const user = await User.findOne({ username }) if (!user || !user.validPassword(password)) { reply.status(401).send({ message: 'Invalid username or password' }) return } // Generate JWT const token = await fastify.jwt.sign({ id: user.id }) reply.send({ token }) })
验证 JWT
在 Fastify 中验证 JWT 需要使用 fastify.jwt.verify
方法。该方法接受一个 JWT 和一些选项,使用指定的密钥验证 JWT 是否有效。
// javascriptcn.com 代码示例 fastify.get('/protected', { preValidation: fastify.authenticate }, async (request, reply) => { const { id } = request.user // Fetch user by id const user = await User.findOne({ id }) if (!user) { reply.status(404).send({ message: 'User not found' }) return } reply.send({ user }) })
集成身份验证
在 Fastify 中集成身份验证需要使用 fastify.authenticate
预处理程序。该程序使用 fastify-jwt
插件验证 JWT,如果 JWT 有效则将用户信息添加到请求对象中。
// javascriptcn.com 代码示例 fastify.decorate('authenticate', async (request, reply) => { try { await request.jwtVerify() } catch (err) { reply.send(err) } }) fastify.addHook('preHandler', async (request, reply) => { try { await request.jwtVerify() } catch (err) { reply.send(err) } })
总结
在本文中,我们介绍了如何在 Fastify 框架中使用 JWT 身份认证。我们了解了什么是 Fastify 和 JWT,以及如何在 Fastify 中配置、生成和验证 JWT。我们还介绍了如何使用 fastify-jwt
插件集成身份验证,并提供了示例代码。希望本文能够对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657417dcd2f5e1655dd52f4b