在现代 Web 应用程序中,认证是必不可少的一部分。在 Fastify 中,我们可以使用 Passport 来实现各种身份验证策略,例如本地、OAuth、OpenId 等等。在这篇文章中,我们将详细介绍如何将 Passport 与 Fastify 集成,以创建安全,易于使用的 Web 应用程序。
准备工作
在开始之前,我们需要确保已安装以下软件:
- Node.js
- Fastify:您可以在
package.json
中添加"fastify": "^3.0.0"
,然后运行npm install
来安装。
我们还需要安装一些必要的依赖项:
npm install fastify-cookie fastify-cors fastify-jwt fastify-passport passport passport-jwt --save
准备 Passport
我们将开始配置 Passport。我们将使用本地策略,这意味着我们将使用用户名和密码进行登录。请注意,如果您需要使用其他策略,需要进行额外的配置和步骤。
首先,在项目的根目录下创建一个名为 auth.js
的文件,并将以下代码添加到文件中:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ---------------- -------------- ---------- --------- ----- -- - --- - ---------------- - --------- ---------- ----- ------- - --------- ---------- ------ - ----------- --------- ------- -- - --- ------- --------------------------- - ----------------------------- -----
在这里,我们定义了一个本地策略并实现了它的验证逻辑。在这个例子中,我们没有执行实际的用户验证。您需要将其替换为您的实际验证逻辑。
接下来,在该文件中添加以下代码,以添加 Cookie 序列化和反序列化支持:
-- -------------------- ---- ------- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - --- - ------------ -- ----- - ------------------ --------- ----- - ---------- ---- -------- ---------- ----- -- ---
最后,在您的 fastify
应用程序中,添加以下代码:
app.register(require('fastify-passport')); app.use(passport.initialize()); app.use(passport.session());
现在,我们已经成功地配置了 Passport。接下来,让我们将其与 Fastify 集成。
集成 Passport 到 Fastify
现在我们已经完成了 Passport 的设置,让我们将它集成到 Fastify 应用程序中。按照下面的步骤:
首先,我们将添加路由来处理登录。在 auth.js
中添加以下代码:
app.post( '/login', { preValidation: passport.authenticate('local', { session: false }), schema }, async (req, res) => { //在这里执行登录后的逻辑,并返回 token } );
在这里,我们将 passport.authenticate
函数作为 Fastify 中间件使用。它将验证用户名和密码,并将成功验证的用户传递给路由处理程序。在这个例子中,我们返回了一个 JWT token,但您可以使用任何其他身份验证策略。
接下来,我们将添加一个中间件来检查每个请求的 JWT token 是否有效。在 auth.js
中添加以下代码:
-- -------------------- ---- ------- ------------------------- ----- ---- ----- -- - ---------------------------- - -------- ----- -- ----- ----- -- - -- ---- -- ------ - ---------- ------ -------------- --- - ---- - ------- - ------- ---- ------ ---
在这里,我们使用了 Passport 的 JWT Strategy,并将其作为 Fastify 中间件使用。如果验证失败,则中间件将返回 401 未经授权的错误码。否则,将继续处理请求。
到目前为止,我们已经成功地集成了 Passport 到 Fastify 应用程序中。现在,我们已经配置了本地和 JWT 策略。让我们来看看如何使用这些策略,以便我们可以将它们用于实际项目中。
使用 Passport
现在,我们已经完成了对 Passport 的设置和集成,我们可以使用 Passport 来处理身份验证了。在这个例子中,我们将使用我们先前设置的本地策略。
首先,我们需要将以下代码添加到您的登录函数中:
-- -------------------- ---- ------- ----- ------------ - ---------- --------- -- - ------ --- ----------------- ------- -- - ------------------------------ ----- ----- ----- -- - -- ---- -- ------ - ------ --------------------- - -------------- ---- ----- - --------- -------- - --- --- --
在这里,我们使用 Promise 包装 Passport 的身份验证功能。使用身份验证功能,LoginHandler 将验证用户并返回 Promise。如果身份验证成功,则 Promise 将返回用户对象。否则,Promise 将拒绝并返回错误消息。
登录后,我们将使用 JWT 生成一个新 token,然后在响应中返回它。例如:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ---------- - ----- --- ------ ----- ----- ----------- - ------ -- - ----- ------- - - ---- ------- -- ----- ------- - - ---------- ---- -- ------ ----------------- ----------- --------- -- ----- ------------ - ---------- --------- -- - ------ --- ----------------- ------- -- - ------------------------------ ----- ----- ----- -- - -- ---- -- ------ - ------ --------------------- - -------------- ---- ----- - --------- -------- - --- --- -- ------------------ ----- ----- ---- -- - ----- - --------- -------- - - --------- --- - ----- ---- - ----- ---------------------- ---------- ----- ----- - ------------------ ---------- ----- --- - ----- ----- - ---------- ------ --- --- - ---
现在,我们已经使用 Passport 集成和配置成功地实现了本地策略和 JWT 认证。在实际项目中,您可以使用各种不同的策略来满足您的需求。
结论
在本文中,我们已经学习了如何在 Fastify 应用程序中集成 Passport 认证。我们详细介绍了如何在 Rails 中配置 Passport,并实现了本地和 JWT 策略的身份验证。
希望您现在可以使用 Passport 在 Fastify 应用程序中创建安全,易于使用的登录系统。如果您在 Passport 的配置中遇到问题,请参阅文档以获取更多帮助。
以下是完整的示例代码,以便您可以使用并尝试新的功能
-- -------------------- ---- ------- -- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ----------- - --------------------------------- ----- ---------- - ----------------------------------- ----- --- - ------------------------ ----- ---------- - ----- --- ------ ----- ---------------- -------------- ---------- --------- ----- -- - --- - ---------------- - --------- ---------- ----- ------- - --------- ---------- ------ - ----------- --------- ------- -- - --- ---------------- ------------- --------------- ----------------------------------------- ------------ ---------- -- ------------- ----- -- - --- - ------------------------- -- - ----------- ---------- ----- - ----------------- --------- ----- -- - --- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - --- - ------------ -- ----- - ------------------ --------- ----- - ---------- ---- -------- ---------- ----- -- --- ----- ----------- - ------ -- - ----- ------- - - ---- ------- -- ----- ------- - - ---------- ---- -- ------ ----------------- ----------- --------- -- ----- ------------ - ---------- --------- -- - ------ --- ----------------- ------- -- - ------------------------------ ----- ----- ----- -- - -- ---- -- ------ - ------ --------------------- - -------------- ---- ----- - --------- -------- - --- --- -- --------- ------------------------------------------ ------------------------------- ---------------------------- --------- --------- - -------------- ------------------------------ - -------- ----- --- ------ -- ----- ----- ---- -- - ----- - --------- -------- - - --------- --- - ----- ---- - ----- ---------------------- ---------- ----- ----- - ------------------ ---------- ----- --- - ----- ----- - ---------- ------ --- --- - - -- ------------------------- ----- ---- ----- -- - ---------------------------- - -------- ----- -- ----- ----- -- - -- ---- -- ------ - ---------- ------ -------------- --- - ---- - ------- - ------- ---- ------ ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6752adea8bd460d3ad974365