使用 Fastify 实现基于 OAuth2.0 的 API 保护

本文将介绍如何使用 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 的认证和授权服务的创建,可以通过以下步骤来访问受保护的路由:

  1. 创建一个授权 URL,重定向用户到该 URL,让用户登录并授权。
const authorizeUrl = fastify.oauth2.authorizationCode.authorizeURL({
  redirect_uri: 'http://localhost:3001/callback',
  scope: 'profile'
})
  1. 在授权回调中,使用授权码获取访问令牌,并将访问令牌存储在客户端。
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)
})
  1. 在客户端请求受保护的路由时,将 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


纠错反馈