推荐答案
// www.javascriptcn.com code example
const fastify = require('fastify')({ logger: true });
const fastifyJwt = require('fastify-jwt');
// 注册 fastify-jwt 插件
fastify.register(fastifyJwt, {
secret: 'supersecret' // 设置 JWT 密钥
});
// 定义一个路由用于生成 JWT
fastify.post('/login', async (request, reply) => {
const { username, password } = request.body;
// 假设验证用户名和密码
if (username === 'admin' && password === 'password') {
const token = fastify.jwt.sign({ username });
return { token };
} else {
reply.code(401).send({ message: 'Invalid credentials' });
}
});
// 定义一个需要 JWT 认证的路由
fastify.get('/protected', { preHandler: [fastify.jwtVerify] }, async (request, reply) => {
return request.user; // 返回解码后的 JWT 数据
});
// 启动服务器
fastify.listen(3000, (err) => {
if (err) {
fastify.log.error(err);
process.exit(1);
}
fastify.log.info('Server listening on http://localhost:3000');
});本题详细解读
1. 安装 fastify-jwt 插件
首先,你需要安装 fastify-jwt 插件。可以通过以下命令安装:
npm install fastify-jwt
2. 注册 fastify-jwt 插件
在 Fastify 应用中,你需要注册 fastify-jwt 插件,并提供一个密钥(secret)。这个密钥将用于签名和验证 JWT。
fastify.register(fastifyJwt, {
secret: 'supersecret' // 设置 JWT 密钥
});3. 生成 JWT
在 /login 路由中,你可以通过 fastify.jwt.sign 方法生成 JWT。这个方法接受一个对象作为参数,通常是用户的信息(如用户名、用户ID等),并返回一个签名的 JWT。
// www.javascriptcn.com code example
fastify.post('/login', async (request, reply) => {
const { username, password } = request.body;
// 假设验证用户名和密码
if (username === 'admin' && password === 'password') {
const token = fastify.jwt.sign({ username });
return { token };
} else {
reply.code(401).send({ message: 'Invalid credentials' });
}
});4. 验证 JWT
在需要认证的路由中,你可以使用 fastify.jwtVerify 作为 preHandler 钩子来验证 JWT。如果 JWT 有效,request.user 将包含解码后的 JWT 数据。
fastify.get('/protected', { preHandler: [fastify.jwtVerify] }, async (request, reply) => {
return request.user; // 返回解码后的 JWT 数据
});5. 启动服务器
最后,启动 Fastify 服务器,监听指定的端口。
fastify.listen(3000, (err) => {
if (err) {
fastify.log.error(err);
process.exit(1);
}
fastify.log.info('Server listening on http://localhost:3000');
});通过以上步骤,你可以在 Fastify 应用中使用 fastify-jwt 插件来实现 JWT 认证。