在现代 Web 应用程序中,身份验证和授权已经成为了必不可少的部分。Fastify 是一个快速、低开销、高效的 Node.js Web 框架,它提供了一个简单而强大的插件系统,可以轻松地实现身份验证和授权功能。
本文将介绍如何使用 Fastify 插件来实现身份验证和授权功能,以及如何在 Fastify 应用程序中集成这些插件。我们将从基本的身份验证和授权开始,然后逐步扩展到更高级的场景。
基本身份验证
Fastify 提供了一个名为 fastify-auth
的插件,可以轻松地实现基本身份验证功能。该插件使用 HTTP 基本身份验证方案,该方案使用 Base64 编码的用户名和密码进行身份验证。
首先,我们需要安装 fastify-auth
插件:
npm install fastify-auth
然后,我们可以在 Fastify 应用程序中注册该插件:
const fastify = require('fastify')() fastify.register(require('fastify-auth'))
接下来,我们需要定义一个验证函数来检查用户提供的凭据是否有效。在本例中,我们将使用一个简单的用户名和密码列表:
-- -------------------- ---- ------- ----- ----- - - - --------- -------- --------- ---------- -- - --------- ------- --------- ---------- - - ----- -------- ---------------------- --------- - ----- ---- - ------------ -- ---------- --- -------- -- ---------- --- --------- -- ------- - ----- --- -------------- ------------- - ------ ---- -
然后,我们可以使用 fastify.auth
方法来定义一个路由需要身份验证:
fastify.get('/protected', { preHandler: fastify.auth([fastify.basicAuth(validateUser)]) }, async (request, reply) => { return 'Hello, ' + request.user.username })
在上面的示例中,我们使用 fastify.auth
方法来定义 /protected
路由需要身份验证。我们还指定了一个名为 preHandler
的选项,该选项将在路由处理程序之前执行。preHandler
选项接受一个函数数组,该函数数组将按顺序执行。在本例中,我们使用 fastify.basicAuth
方法来指定基本身份验证方案,并将 validateUser
函数作为验证函数。
现在,当用户尝试访问 /protected
路由时,他们将被提示输入用户名和密码。如果用户提供的凭据有效,他们将被允许访问受保护的资源。
JWT 身份验证和授权
除了基本身份验证之外,Fastify 还提供了许多其他身份验证和授权插件。在本节中,我们将介绍如何使用 fastify-jwt
插件来实现 JWT 身份验证和授权功能。
首先,我们需要安装 fastify-jwt
插件:
npm install fastify-jwt
然后,我们可以在 Fastify 应用程序中注册该插件:
const fastify = require('fastify')() fastify.register(require('fastify-jwt'), { secret: 'supersecret' })
在上面的示例中,我们使用 fastify-jwt
插件来设置一个名为 jwt
的装饰器,该装饰器用于生成和验证 JWT。我们还指定了一个名为 secret
的选项,该选项用于指定 JWT 的密钥。
接下来,我们可以使用 fastify.route
方法来定义需要 JWT 身份验证和授权的路由:
fastify.route({ method: 'GET', url: '/protected', preHandler: fastify.auth([fastify.verifyJWT]), handler: async (request, reply) => { return 'Hello, ' + request.user.username } })
在上面的示例中,我们使用 fastify.verifyJWT
方法来指定需要 JWT 身份验证。我们还使用 fastify.auth
方法来指定需要 JWT 授权。如果用户提供的 JWT 包含正确的签名和有效期,他们将被允许访问受保护的资源。
现在,我们需要创建一个 JWT 来进行测试。我们可以使用 jwt.sign
方法来生成 JWT:
const jwt = require('jsonwebtoken') const token = jwt.sign({ username: 'admin' }, 'supersecret')
在上面的示例中,我们使用 jsonwebtoken
模块来生成 JWT。我们还指定了一个名为 username
的负载,该负载将在 JWT 中进行传输。最后,我们使用 supersecret
密钥对 JWT 进行签名。
现在,我们可以使用生成的 JWT 来测试 /protected
路由:
curl -H "Authorization: Bearer ${token}" http://localhost:3000/protected
如果 JWT 包含正确的签名和有效期,您将看到 Hello, admin
的响应。
结论
通过使用 Fastify 插件,我们可以轻松地实现身份验证和授权功能。在本文中,我们介绍了基本身份验证和 JWT 身份验证和授权。我们还提供了示例代码来帮助您开始使用这些插件。
使用身份验证和授权功能可以帮助您保护您的应用程序并防止未经授权的访问。我们希望本文能够帮助您了解如何在 Fastify 应用程序中实现这些功能,并为您提供指导和参考。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6742d3fb99516187acd3ff7b