Fastify 是一种高效的 Node.js Web 框架,其许多特征特别适合构建高性能 Web 应用程序。对于许多 Web 应用程序来说,认证和授权是实现安全访问的必要部分。在本文中,我们将介绍在 Fastify 中构建基本认证中间件的最佳实践,同时提供示例代码和详细解释。
Fastify 插件
在 Fastify 中,通过使用插件和中间件来实现许多功能。插件可以将路由、请求钩子和其他功能自动添加到 Fastify 应用程序中。因此,在构建 Auth 中间件之前,您需要理解 Fastify 插件是如何工作的。
Fastify 插件提供了一个简单的机制来组织应用程序的功能,保持代码的整洁和易于维护。插件由以下组件组成:
- options 对象,用于指定插件的配置选项。
- register 函数,是实际编写插件的主要功能。
实现基本认证插件
基本身份验证是一种常见的用户身份验证方法,它在 HTTP 标头中包含用户的凭据,并且不加密这些凭据。该插件将检查用户提供的凭据,并根据提供的凭据控制访问。
安装依赖
在构建中间件之前,我们需要在 Fastify 应用程序中安装一些依赖项。我们将需要安装 fastify-authenticator 和 fastify-plugin 这两个 NPM 包。运行以下命令:
npm i fastify-authenticator fastify-plugin
编写插件
现在我们已经安装了必要的依赖项,我们可以开始编写 Fastify 插件。我们首先通过导入 fastify-authenticator 包来创建一个基本身份验证插件。为了实现多用户身份验证,我们将使用基于 Json 文件的基本身份验证。
// javascriptcn.com 代码示例 const auth = require('fastify-authenticator') const Basic = require('fastify-authenticator/basic') async function basicAuth(fastify, opts, next) { const users = { john: { username: 'john', password: 'password', role: 'admin' }, jane: { username: 'jane', password: 'password', role: 'user' } } fastify.register(auth) fastify.authenticate(async (username, password) => { const user = users[username] if (!user || password !== user.password) { return new Error('Invalid credentials') } return user }) fastify.register(async (fastify, options) => { fastify.addHook('preHandler', async (request, reply) => { try { await request.jwtVerify() } catch (err) { reply.send(err) } }) }, { prefix: '/protected' }) } module.exports = fastifyPlugin(basicAuth, { name: 'basic-auth' })
在上面的代码中,我们创建了一个名为 basicAuth 的插件,并传递了三个参数,fastify、opts 和 next。该插件定义了一个名为 users 的对象,其中包含两个用户 john 和 jane,以及他们的用户名、密码以及角色。基本身份验证插件注册了 fastify-authenticator,并使用其 authenticate() 方法为应用程序配置身份验证。如果提供的凭据无效,则会返回一个错误。
这个插件还为应用程序指定了一个中间件,这个中间件要求将 /protected 前缀与其它路由区别开来。这个中间件检查 JWT 令牌并执行一些其他的安全控件。
注册插件
注如果要在 Fastify 应用程序中使用您的插件,您需要使用 fastify.register() 方法调用该插件。 在您的应用程序中注册 basicAuth 插件的示例代码如下:
// javascriptcn.com 代码示例 const fastify = require('fastify')({ logger: true }) fastify.register(require('fastify-jwt'), { secret: 'supersecret' }) fastify.register(require('./basic-auth')) fastify.post('/login', async (request, reply) => { const { username, password } = request.body const user = users[username] if (!user || password !== user.password) { return reply.unauthorized('Invalid credentials') } const token = fastify.jwt.sign({ username, role: user.role }) return { token } }) fastify.listen(3000, (err) => { if (err) { fastify.log.error(err) process.exit(1) } fastify.log.info(`server listening on ${fastify.server.address().port}`) })
在上面的代码中,我们使用 fastify-jwt 包设置了一个密钥,该密钥用于签署 JWT 令牌。 我们还注册了本文中创建的 basicAuth 插件。基本身份验证插件注册了不同的中间件,需要对此进行区分。
总结
在本文中,我们介绍了使用 Fastify 框架构建基本认证插件的最佳实践。我们学习了如何使用 fastify-authenticator 包和 fastify-plugin 包来创建和注册插件,以及如何使用 Fastify 的中间件系统来执行安全控件。作为开发人员,用 Fastify 实现基本身份验证绝对是一个很好的技能,因为这可以确保您的 Web 应用程序足够安全,以便访问是受限制的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653236aa7d4982a6eb48d737