在 Web 应用开发中,身份认证是一项至关重要的工作,常常使用 Token 方式进行身份认证。在 Fastify 中使用 jsonwebtoken 可以很方便地实现 Token 的生成和校验,本文将详细介绍如何在 Fastify 中使用 jsonwebtoken 完成身份认证功能。
什么是 jsonwebtoken
jsonwebtoken 是一种开放标准(RFC 7519),用于在双方之间安全地传输信息。在身份认证中,jsonwebtoken 通常用于生成和验证 Token,它可以在 Token 中存储用户身份信息,从而实现身份认证。jsonwebtoken 的特点是轻量、简单、易用。
安装 jsonwebtoken
安装 jsonwebtoken 的命令为:
npm install jsonwebtoken
在 Fastify 中使用 jsonwebtoken
在 Fastify 中使用 jsonwebtoken 的步骤如下:
- 引入 jsonwebtoken 模块
const jwt = require('jsonwebtoken');
- 设置 Secret
Secret 是一个字符串,用于签署 Token。可以将 Secret 存储在环境变量中,避免硬编码。
const fs = require('fs'); const privateKey = fs.readFileSync('private.key'); const publicKey = fs.readFileSync('public.key'); // 或者通过环境变量设置 Secret const secret = process.env.JWT_SECRET || 'my-secret';
- 生成 Token
使用 jwt.sign() 函数生成 Token,其参数包括 Payload 和 Secret。Payload 是一个包含用户身份信息的 JSON 对象。生成的 Token 可以用于身份验证。
const Payload = { id: 1, username: 'test' }; const token = jwt.sign(Payload, secret, { expiresIn: '1h' });
在上面的代码中,expiresIn 指定 Token 的有效期为 1 小时。
- 验证 Token
使用 jwt.verify() 函数验证 Token,其参数包括 Token 和 Secret。如果 Token 验证成功,jwt.verify() 函数返回包含 Payload 的 JSON 对象,否则返回错误信息。
// javascriptcn.com 代码示例 fastify.get('/protected', (request, reply) => { const token = request.headers.authorization.replace('Bearer ', ''); jwt.verify(token, secret, (err, decoded) => { if (err) { reply.status(401).send({ error: 'Token 校验失败' }); } else { reply.send({ user: decoded }); } }); });
- 发送 Token
在身份认证成功之后,可以将 Token 发送给客户端。客户端可以使用 Token 访问受保护的资源,一般使用 HTTP 请求的 Authorization 头部字段传递 Token。
// javascriptcn.com 代码示例 fastify.get('/protected', (request, reply) => { const token = request.headers.authorization.replace('Bearer ', ''); jwt.verify(token, secret, (err, decoded) => { if (err) { reply.status(401).send({ error: 'Token 校验失败' }); } else { reply.send({ message: '身份验证成功', token: token }); } }); });
示例代码
下面是一个完整的 Fastify 应用示例代码,其中演示了如何使用 jsonwebtoken 实现身份认证:
// javascriptcn.com 代码示例 const fastify = require('fastify')({ logger: true }); const jwt = require('jsonwebtoken'); const fs = require('fs'); const privateKey = fs.readFileSync('private.key'); const publicKey = fs.readFileSync('public.key'); const secret = process.env.JWT_SECRET || 'my-secret'; // 生成 Token fastify.get('/generate', (request, reply) => { const Payload = { id: 1, username: 'test' }; const token = jwt.sign(Payload, secret, { expiresIn: '1h' }); reply.send({ token: token }); }); // 验证 Token fastify.get('/protected', (request, reply) => { const token = request.headers.authorization.replace('Bearer ', ''); jwt.verify(token, secret, (err, decoded) => { if (err) { reply.status(401).send({ error: 'Token 校验失败' }); } else { reply.send({ user: decoded }); } }); }); fastify.listen(3000, (err, address) => { if (err) { fastify.log.error('启动失败', err); process.exit(1); } fastify.log.info(`应用已启动:${address}`); });
总结
本文介绍了在 Fastify 中使用 jsonwebtoken 实现身份认证的方法,包括生成 Token、验证 Token 和发送 Token。使用 jsonwebtoken 实现身份认证的优点是轻量、简单、易用。建议在实际开发中使用 jsonwebtoken 实现身份认证。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654328dd7d4982a6ebccf008