Fastify 中使用 JWT 鉴权的实现方案
JWT(JSON Web Token)是一种认证及授权机制,用于在客户端和服务端之间进行身份验证。在前后端分离的架构中,JWT 鉴权已经成为前端开发的一项基本技能。在 Fastify 中,我们也可以使用 JWT 鉴权进行用户认证和权限控制。
在 Fastify 中使用 JWT 鉴权,需要安装相应的插件 fastify-jwt。可以通过 npm 命令进行安装:
npm install fastify-jwt
安装完插件后,在 Fastify 应用中引入并注册插件:
// www.javascriptcn.com code example
const Fastify = require('fastify');
const fastify = Fastify();
// 引入 fastify-jwt 插件
const fastifyJwt = require('fastify-jwt');
// 注册插件并设置秘钥
fastify.register(fastifyJwt, {
secret: 'mysecretkey'
});在注册插件时,需要设置一个秘钥用于生成和解码 JWT。在实际项目中,秘钥应该通过安全的方式进行存储,以确保用户数据的安全性。
接下来,我们可以在路由中使用 JWT 进行认证和权限控制。一般来说,JWT 可以分为三个部分,分别是 Header、Payload 和 Signature。Header 中包含算法和类型等信息,Payload 中存储了用户的信息,Signature 是对 Header 和 Payload 进行签名之后的字符串。
下面是一个简单的示例代码,用于演示 JWT 的生成和解码过程:
// www.javascriptcn.com code example
// 生成 JWT
const token = fastify.jwt.sign({ user_id: '123' });
// 解码 JWT
fastify.jwt.verify(token, (err, decodedToken) => {
if (err) {
throw err
}
console.log(decodedToken.user_id) // 输出 123
})在实际应用中,我们可以将 JWT 存储在客户端的 Cookie 或 LocalStorage 中,来实现用户的持久化登录。通过解码 JWT,我们可以获取用户的信息,进行权限控制等操作。
下面是一个使用 Fastify 和 JWT 进行用户认证和权限控制的示例代码:
// www.javascriptcn.com code example
// 定义路由
fastify.post('/login', async (request, reply) => {
const { username, password } = request.body;
// 模拟登录,获取用户信息
const user = await getUserByUsernameAndPassword(username, password);
if (!user) {
reply.status(401).send({ error: 'Invalid username or password' });
return;
}
// 生成 JWT 并存储到 Cookie 中
const token = fastify.jwt.sign({ user_id: user.id });
reply.setCookie('jwt', token, { path: '/' });
// 返回用户信息
return { user };
});
// 需要认证的路由
fastify.get('/account', { preValidation: fastify.auth([fastify.verifySession]) }, async (request, reply) => {
const { user_id } = request.user;
const user = await getUserById(user_id);
return { user };
});
// JWT 验证方法
fastify.decorate('verifySession', async (request, reply) => {
try {
// 从 Cookie 中获取 JWT
const token = request.cookies.jwt;
// 解码 JWT 以获取用户 ID
const payload = await fastify.jwt.verify(token);
// 将用户 ID 存储在请求中
request.user = { user_id: payload.user_id };
} catch (err) {
// 抛出异常以通知 Fastify 权限验证失败
throw new Error('Unauthorized');
}
});在 /login 路由中,我们通过检查用户输入的用户名和密码,来进行用户的身份认证。如果登录成功,我们会生成一个 JWT 并将其存储到客户端的 Cookie 中。在 /account 路由中,我们使用 preValidation 钩子函数来定义一个中间件 verifySession,用于从请求中获取 JWT 并解码出当前用户的 ID。如果解码失败,则将抛出异常以通知 Fastify 权限验证失败。
在实际项目中,我们需要更加复杂的权限控制方式来保障用户数据的安全性。但是,通过 JWT 鉴权的方案,我们可以快速地实现用户认证和权限控制的功能,并且可以保证跨域的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d67730a941bf7134c3b7cb