在现代 Web 开发中,用户认证是一个必不可少的环节。为了让用户可以安全的使用我们的应用,我们需要实现一套认证机制。JWT 是一个非常流行的认证方式,它可以在客户端和服务端之间传递认证信息,并且具有轻量、安全、易扩展等特点。
在 Fastify 中,我们可以轻松地使用 JWT 进行用户认证。下面我们就来详细介绍一下如何在 Fastify 中使用 JWT 进行用户认证。
1. 安装依赖
首先,我们需要安装以下依赖:
npm install fastify-jwt fastify-auth
其中,fastify-jwt
是 JWT 的插件,用于生成和解码 JWT;fastify-auth
是 Fastify 的认证插件,用于管理认证逻辑。
2. 实现认证逻辑
在我们的应用中,我们需要实现一个认证逻辑,用于验证用户身份,并生成 JWT。下面是一个示例的实现代码:
// javascriptcn.com 代码示例 const fastifyJwt = require('fastify-jwt') fastify.register(fastifyJwt, { secret: 'supersecretkey' // JWT 的密钥 }) fastify.post('/login', async (req, res) => { const { username, password } = req.body // 验证用户名和密码 const user = checkUsernameAndPassword(username, password) if (!user) { throw new Error('用户名或密码错误') } // 生成 JWT const token = await fastify.jwt.sign( { id: user.id, username: user.username }, { expiresIn: '1h' } // JWT 的过期时间 ) res.send({ token }) })
在上面的代码中,我们使用了 fastifyJwt
插件生成了一个 JWT 密钥,然后在登录接口中验证了用户名和密码,并生成了一个 JWT 并返回给客户端。
3. 使用认证逻辑
接下来,在我们的 API 接口中,我们需要使用上面生成的 JWT 进行用户认证,只有通过认证的用户才能访问受保护的接口。下面是一个示例的实现代码:
// javascriptcn.com 代码示例 const fastifyAuth = require('fastify-auth') fastify.register(fastifyAuth) fastify.get('/protected', { preValidation: fastify.auth([fastify.verifyJWT]) }, async (req, res) => { res.send({ message: '你已通过认证!' }) })
在上面的代码中,我们使用了 fastify-auth
插件,并在受保护的接口中使用了 fastify.verifyJWT
函数进行 JWT 的验证。只有通过验证的用户才能访问该接口。
4. 完整示例代码
// javascriptcn.com 代码示例 const fastify = require('fastify')() const fastifyJwt = require('fastify-jwt') const fastifyAuth = require('fastify-auth') fastify.register(fastifyJwt, { secret: 'supersecretkey' }) fastify.register(fastifyAuth) // 模拟用户数据 const users = [ { id: 1, username: 'testuser', password: 'testpassword' } ] // 验证用户名和密码 function checkUsernameAndPassword(username, password) { return users.find(user => user.username === username && user.password === password) } // 生成 JWT async function generateToken(user) { const token = await fastify.jwt.sign( { id: user.id, username: user.username }, { expiresIn: '1h' } ) return token } fastify.post('/login', async (req, res) => { const { username, password } = req.body // 验证用户名和密码 const user = checkUsernameAndPassword(username, password) if (!user) { throw new Error('用户名或密码错误') } // 生成 JWT const token = await generateToken(user) res.send({ token }) }) fastify.get('/protected', { preValidation: fastify.auth([fastify.verifyJWT]) }, async (req, res) => { res.send({ message: '你已通过认证!' }) }) fastify.listen(3000, (err) => { if (err) { console.error(err) process.exit(1) } console.log('Server running at http://localhost:3000') })
总结
在这篇文章中,我们详细介绍了如何在 Fastify 中使用 JWT 进行用户认证。通过上面的步骤,我们可以轻松地实现一个安全、可靠的用户认证系统。同时,我们也可以根据自己的实际需求灵活调整认证逻辑,加强应用的安全性和用户体验。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6549d2b07d4982a6eb40aaa2