在现代 Web 开发中,身份验证是一个必不可少的部分。为了保护用户数据和确保应用程序的安全性,必须确保只有经过身份验证的用户才能访问特定的资源。本文将介绍如何使用 Fastify 和 Passport.js 实现身份验证。
Fastify
Fastify 是一个高度专注于性能的 Web 框架。它使用了许多现代技术,包括异步编程、流控制和缓存技术,使其能够处理大量的并发请求。在本文中,我们将使用 Fastify 作为我们的 Web 框架。如果您还没有安装 Fastify,可以使用以下命令安装:
npm install fastify
在创建 Fastify 应用程序之前,我们需要安装 Fastify 的身份验证插件。
npm install fastify-auth
Passport.js
Passport.js 是一个非常流行的身份验证框架,它支持多种身份验证策略,例如本地用户名和密码、第三方 OAuth 提供者、OpenID 等。在本文中,我们将使用本地身份验证策略。
您可以使用以下命令来安装 Passport.js
npm install passport passport-local
实现身份验证
在本文的余下部分,我们将实现一个简单的身份验证。我们将使用 Passport.js 和 Fastify 的身份验证插件来实现身份验证。
我们将把身份验证逻辑放在 login
路由中。在这个路由中,我们将接受用户的用户名和密码,并使用 Passport.js 进行身份验证。如果身份验证成功,我们将返回一个 JSON 格式的成功消息,否则将返回一个失败消息。
以下是完整的 login
路由的代码:
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----- -------- - ------------------- ----- ------------- - ---------------------------------- ----- ----------- - ----------------------- ----------------------------- ------------------------------------------- -------------------------------------------- - ------- --------------------- -- -- ------- - ------- ----- -- --------- ---------------------------------------------------------- - -- ---------------- ------------------------ --------- ----- -- - -- -------------------------- -- --------- --- ------- -- -------- --- -------- - ------ ---------- - -------- -- - ---- - ------ ---------- ------ - --- ----------------------------- ----- -- - ---------- -------------- -- ----------------------------------- ----- -- - ---------- - -------- -- -- ---------------------------- --------- -------------------------------- ----- --------- ------ -- - --- - ----- ---------------------- - ----- ----- - --------------------------- - -- ---------------------- - ----------- -------------------- -- --------- ------ -- - ------------ -------- ------ -- -- -------------------- ----- -------- -- - -- ----- - ---------------------- --------------- - ------------------------ --------- -- ------------ --
在上面的代码中,我们首先加载所需的模块和插件。然后,我们注册 fastify-cookie
和 fastify-session
插件以支持会话管理。fastify-session
会在会话 cookie 上签名,防止会话cookie被篡改。
我们使用 passport-local
策略来实现本地身份验证。通过以下代码向 Passport.js 注册本地策略:
passport.use(new LocalStrategy((username, password, done) => { // 此处应该从数据库中查询用户信息,并且验证用户名和密码 if (username === 'admin' && password === 'admin') { return done(null, { username }) } else { return done(null, false) } }))
在本地策略回调中,我们根据传入的用户名和密码验证用户的身份。如果验证成功,我们将返回用户对象,否则将返回 false。
我们还定义了 serializeUser
和 deserializeUser
方法。这两个方法在登录和注销期间分别被调用,用于将用户信息存储在会话中和从会话中恢复用户信息。
passport.serializeUser((user, done) => { done(null, user.username) }) passport.deserializeUser((username, done) => { done(null, { username }) })
接下来,我们使用以下代码向 Fastify 注册 Passport.js 类实例和 fastify-auth
插件:
fastify.decorate('passport', passport) fastify.decorate('authenticate', async (request, reply) => { try { await request.authenticate() } catch (err) { reply.status(401).send(err) } })
我们定义了 authenticate
方法,该方法用于验证用户是否已通过身份验证。如果请求未经验证,则会返回带有 401 响应状态码的错误消息。
最后,我们定义了我们的 login
路由。我们使用 Fastify 的 preHandler
钩子函数和 fastify.authenticate
插件来强制执行身份验证。如果身份验证成功,我们将返回 JSON 格式的成功消息。
结论
在本文中,我们介绍了如何使用 Fastify 和 Passport.js 实现身份验证。我们了解了如何使用 Passport.js 中的本地身份验证策略,并通过 Fastify 的 fastify-auth
插件将身份验证逻辑集成到我们的应用程序中。这是一个非常基础的示例,但这些技术可以扩展到更高级的身份验证场景。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675161578bd460d3ad892199