本文将介绍如何使用 Fastify 实现基于 OAuth2.0 的 API 保护。OAuth2.0 是一种常用的认证和授权协议,可以用于保护 API,防止未经授权的访问。在本文中,我们将使用 OAuth2.0 插件 来实现 OAuth2.0 认证和授权,同时,我们还将使用 jsonwebtoken 库来生成和验证 JWT(JSON Web Tokens)。
前提条件
在开始使用 Fastify 实现基于 OAuth2.0 的 API 保护之前,你需要了解以下知识:
- Fastify 服务器框架的使用方法。
- OAuth2.0 的基本理念和认证流程。
- JWT(JSON Web Tokens)的基本知识和使用方法。
安装 OAuth2.0 插件
首先,我们需要安装 Fastify OAuth2.0 插件。可以通过以下命令来安装:
npm install fastify-oauth2
创建 OAuth2.0 认证和授权服务
接下来,我们需要创建一个 OAuth2.0 认证和授权服务。可以通过以下代码来创建:
const fastify = require('fastify')() fastify.register(require('fastify-oauth2'), { name: 'oauth2', credentials: { client: { id: 'CLIENT_ID', secret: 'CLIENT_SECRET' }, auth: { tokenHost: 'http://localhost:3000', authorizePath: '/oauth2/authorize', tokenPath: '/oauth2/token' } }, scope: ['profile'] }) // 定义用于生成 JWT 的密钥 const secretKey = 'mysecretkey' // 定义用于生成 JWT 的选项 const jwtOptions = { algorithm: 'HS256', expiresIn: '1h' } // 定义生成 JWT 的函数 function generateJWT (user) { return jwt.sign(user, secretKey, jwtOptions) } // 定义验证 JWT 的中间件 function checkJWT (request, reply, done) { if (!request.headers.authorization) { return reply.code(401).send({ error: 'Unauthorized' }) } const token = request.headers.authorization.replace('Bearer ', '') jwt.verify(token, secretKey, jwtOptions, (error, decoded) => { if (error) { return reply.code(401).send({ error: 'Unauthorized' }) } request.user = decoded done() }) } // 定义受保护的路由 fastify.get('/protected', { preHandler: checkJWT }, (request, reply) => { reply.send({ user: request.user }) }) // 启动服务器 fastify.listen(3000).then(() => { console.log('Server running at http://localhost:3000/') })
在上面的代码中,我们首先注册了 Fastify OAuth2.0 插件,并配置了 OAuth2.0 的客户端凭据和认证地址。同时,我们定义了一个用于生成 JWT 的函数和一个用于验证 JWT 的中间件。最后,定义了一个受保护的路由,使用了 preHandler
钩子函数来先验证 JWT,再处理请求。
访问受保护的路由
现在,我们已经完成了 OAuth2.0 的认证和授权服务的创建,可以通过以下步骤来访问受保护的路由:
- 创建一个授权 URL,重定向用户到该 URL,让用户登录并授权。
const authorizeUrl = fastify.oauth2.authorizationCode.authorizeURL({ redirect_uri: 'http://localhost:3001/callback', scope: 'profile' })
- 在授权回调中,使用授权码获取访问令牌,并将访问令牌存储在客户端。
fastify.get('/callback', async (request, reply) => { const tokenOptions = { redirect_uri: 'http://localhost:3001/callback' } const accessToken = await fastify.oauth2.getAccessTokenFromAuthorizationCodeFlow(request.query, tokenOptions) // 存储 accessToken reply.send(accessToken) })
- 在客户端请求受保护的路由时,将 JWT 放在请求的
Authorization
头部中,以Bearer
开头。
const headers = { Authorization: 'Bearer ' + accessToken } axios.get('http://localhost:3000/protected', { headers })
总结
本文介绍了如何使用 Fastify 实现基于 OAuth2.0 的 API 保护。通过这种方式,我们可以简单地实现认证和授权,保护我们的 API,防止未经授权的访问。同时,我们还学习了 JWT 的使用方法,可以更好地控制访问权限。希望这篇文章对你有所帮助!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a60486add4f0e0ffea5ba5