在 Fastify 中集成 Passport 鉴权
随着互联网的不断发展,Web 应用程序变得越来越复杂,用户之间的访问权限和安全性也越来越重要。因此,鉴权功能已成为现代 Web 应用程序中不可缺少的一部分。而 Passport 是一个流行的 Node.js 鉴权中间件库,它能够帮助我们轻松地实现最常见的鉴权策略。本文将介绍如何在 Fastify 中集成 Passport 鉴权。
什么是 Fastify?
Fastify 是一个快速,低开销且高度可定制的 Web 框架,它旨在提供最佳性能。Fastify 构建在现代 Node.js 版本上,使用异步编程模型和最新的 JavaScript 功能。
Passport 模块简介
Passport 是一个 Node.js 鉴权中间件库,由 Jared Hanson 创造和维护。它提供了一种简单且易于使用的方式来集成不同的鉴权策略。Passport 提供的策略包括本地鉴权、OAuth、OpenID Connect、构建自己的策略和其他许多社交网络鉴权。
Step 1:安装 Fastify 和 Passport 插件
在实现鉴权之前,首先需要安装 Fastify 和 Passport 插件。可以通过以下命令来安装它们:
npm install fastify fastify-passport
Step 2:实现本地鉴权策略
本地策略是 Passport 最基本的鉴权策略,它通常用于使用用户名和密码安全验证用户。在本地策略中,需要实现一个回调函数,该函数用于验证用户凭据并返回成功或失败。
-- -------------------- ---- ------- ----- ----- - - - --- -- --------- ------- --------- ---------- -- - --- -- --------- ------- --------- ---------- -- - --- -- --------- ------ --------- ---------- -- -- ------------------------ --------------- -------------- ----------- -------------- ----------- -- ---------- --------- ----- -- - ----- ---- - ----------------- -- - ------ ------------- --- -------- -- ------------- --- --------- --- -- ------- - ------ ---------- ------ - -------- -------- -------- -- --------- --- - ------ ---------- ------ ----
在上面的代码中,我们首先定义了一个 users 数组,该数组包含了三个用户对象。然后,我们使用 Passport 的 LocalStrategy 来实现本地鉴权策略。在这里,我们定义了一个回调函数,该函数接受用户名和密码参数,并在 users 数组中查找匹配的用户。如果找到匹配的用户,则将其作为第二个参数传递给 done 回调函数。
Step 3:创建登录路由
创建 Fastify 路由,用于用户登录。在该路由中,我们会使用 Passport 的 authenticate 方法来调用本地鉴权策略。
fastify.post('/login', fastify.passport.authenticate('local'), (request, reply) => { reply.send({ user: request.user }); });
在上面的代码中,我们定义了一个 /login POST 路由,并调用了 Passport 的 authenticate 方法来使用 local 策略进行鉴权。如果鉴权成功,则 request.user 将包含鉴权用户的详细信息并在 response 中进行返回。
Step 4:添加身份验证检测路由
添加一个 Fastify 路由,用于检测用户是否已经登录。该路由使用 Passport 的 isAuthenticated 方法来实现身份验证检测。
fastify.get('/user', fastify.passport.authenticate('jwt', { session: false }), (request, reply) => { reply.send({ user: request.user }); });
在上面的代码中,我们定义了一个 /user GET 路由,并调用了 Passport 的 isAuthenticated 方法来进行身份验证检测。如果检测成功,则 request.user 将包含鉴权用户的详细信息并在 response 中进行返回。
Step 5:实现 JWT 鉴权策略
JWT(JSON Web Token)是一种用于安全传输信息的开放标准。使用 JWT 可以在用户和服务器之间传输信息,并且该信息可以进行数字签名以确保数据的完整性和安全性。在 Fastify 中,可以使用 fastify-jwt 插件来实现 JWT 鉴权策略。首先需要安装该插件:
npm install fastify-jwt
然后,定义下面的代码以生成 JWT 令牌:
-- -------------------- ---- ------- ---------------------- ----- --------- ------ -- - ----- - --------- -------- - - ------------- ----- ---- - --------------- -- ------------- --- -------- -- ------------- --- ---------- -- ------- - ----- --- -------------- -------- -- ----------- - ----- ----- - ----- ------------------ --- ------- --- ------------ ----- --- ---
在上面的代码中,我们定义了一个 /login POST 路由,如果用户提供了有效的用户名和密码,则通过 fastify.jwt.sign() 方法生成一个 JWT 令牌,并在 response 中进行返回。
然后,我们需要实现 Passport 的 JWT 策略,并将其添加到 Fastify 应用程序中:
-- -------------------- ---- ------- ------------------------ ------------- ------------ ------------------ --------------- ----------------------------------------- -- --------- ----- -- - ----- ---- - --------------- -- ------- --- ------------ -- ------- - ------ ---------- ------ - -------- -------- ----- --- - ------ ---------- ------ ----
在上面的代码中,我们首先将 JwtStrategy 添加到 Passport 中,并定义了一个回调函数。该回调函数接受从JWT 解码的有效载荷,并查找 users 数组中与有效载荷中的 id 相匹配的用户。如果找到匹配的用户,则将其作为第二个参数传递给 done 回调函数。
最后,我们需要更新 /user 路由以使用 Passport 的 isAuthenticated 和 jwt 鉴权策略:
fastify.get('/user', fastify.passport.authenticate('jwt', { session: false }), (request, reply) => { reply.send({ user: request.user }); });
在上面的代码中,我们使用 fastify.passport.authenticate() 方法来鉴权使用 jwt 策略进行身份验证的用户。如果鉴权成功,则 request.user 将包含鉴权用户的详细信息并在 response 中进行返回。
总结
本文介绍了如何在 Fastify 中轻松地集成 Passport 鉴权策略。本地鉴权策略通常用于用户名和密码验证,而使用 JWT 可以更安全地验证用户。通过使用 Passport,我们可以更轻松地实现鉴权功能,这可以帮助我们保护 Web 应用程序,并确保只有授权的用户可以访问敏感数据和资源。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ccd97f5ad90b6d042d3f68