前言
在现代 Web 应用程序中,身份验证和授权是至关重要的。在前端应用程序中,常见的身份验证方式是 JWT(JSON Web Token)。
Fastify 是一个快速、低开销且可扩展的 Node.js Web 框架。在 Fastify 中实现 JWT Authentication 可以确保您的 Web 应用程序的安全性。
本文将介绍如何在 Fastify 框架中实现 JWT Authentication,并提供示例代码。
JWT Authentication
JWT 是一种基于 JSON 的开放标准(RFC 7519),用于在网络应用程序之间传递声明。JWT 由三部分组成:头部、载荷和签名。
头部
头部通常由两部分组成:令牌的类型(JWT)和使用的签名算法(例如 HMAC SHA256 或 RSA)。
{ "alg": "HS256", "typ": "JWT" }
载荷
载荷包含 JWT 包含的声明。声明是有关实体(通常是用户)和其他数据的声明。声明是有关实体(通常是用户)和其他数据的声明。有三种类型的声明:注册声明、公共声明和私人声明。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
签名
签名是使用头部和载荷计算出来的哈希值,以确保消息没有被篡改。签名通常使用密钥计算。
在 Fastify 中实现 JWT Authentication
要在 Fastify 中实现 JWT Authentication,需要使用以下库:
- fastify-jwt:用于生成和验证 JWT。
- fastify-auth:用于定义和验证路由保护。
- bcryptjs:用于加密密码。
安装依赖
npm install fastify-jwt fastify-auth bcryptjs
生成和验证 JWT
// javascriptcn.com 代码示例 const fastify = require('fastify')(); const JWT = require('fastify-jwt'); fastify.register(JWT, { secret: 'supersecret' }); fastify.post('/login', async (request, reply) => { const { username, password } = request.body; // 查询数据库,检查用户名和密码是否匹配 const user = await User.findOne({ username }); if (!user || !bcrypt.compareSync(password, user.password)) { return reply.status(401).send({ message: 'Invalid username or password' }); } // 生成 JWT const token = fastify.jwt.sign({ userId: user._id }); reply.send({ token }); }); fastify.get('/protected', { preValidation: fastify.auth([fastify.verifyJWT]) }, async (request, reply) => { const { userId } = request.user; // 查询数据库,检查用户是否存在 const user = await User.findById(userId); if (!user) { return reply.status(401).send({ message: 'Invalid token' }); } reply.send({ message: `Hello, ${user.username}!` }); });
在上面的代码中,我们使用 fastify-jwt
库生成和验证 JWT。在 fastify.register
中,我们定义了 JWT 的密钥。在 /login
路由中,我们检查用户名和密码是否匹配,如果匹配,则生成 JWT 并将其返回给客户端。在 /protected
路由中,我们使用 fastify.auth
定义了路由保护,并使用 fastify.verifyJWT
验证 JWT。如果 JWT 有效,则查询用户并返回欢迎消息。
加密密码
在 /login
路由中,我们使用 bcryptjs
库加密密码。这可以防止密码在数据库中以明文形式存储。
const bcrypt = require('bcryptjs'); const salt = bcrypt.genSaltSync(10); const hash = bcrypt.hashSync('password', salt);
总结
在本文中,我们介绍了如何在 Fastify 框架中实现 JWT Authentication。我们使用了 fastify-jwt
和 fastify-auth
库来生成和验证 JWT,并使用 bcryptjs
库加密密码。这可以确保您的 Web 应用程序的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/650afa3395b1f8cacd5480ce