Node.js 中如何使用 Passport 进行用户认证?
在实现用户登录或认证功能时,我们通常会使用 Passport 这个非常流行的 Node.js 中间件。Passport 提供了一种通用的方式来进行认证,可以支持多种不同的身份验证策略,包括本地身份验证、基于 OAuth 1.0 和 OAuth 2.0 的第三方身份验证以及其他自定义策略。
本篇文章将会介绍如何使用 Passport 进行用户认证,并且会提供一些示例代码和深度的解析,帮助读者了解如何在 Node.js 项目中集成 Passport。
- 安装 Passport
首先,我们需要安装 Passport 以及一些其他必要的中间件。可以通过 npm 命令行安装:
npm install passport passport-local express-session bcrypt
其中,passport
是 Passport 的核心模块,passport-local
模块是实现本地身份验证的插件,express-session
模块用于在 Express 应用程序中启用会话支持,bcrypt
模块用于加密和解密用户密码。
- 初始化 Passport
在应用程序入口点的顶部,我们需要引入并初始化 Passport。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------- - --------------------------- ----------------- ------- ----------------------- ------- ------ ------------------ ---- ---- ------------------------------- ----------------------------
首先,我们在应用程序中启用会话支持,并将其传递给 Passport。这将确保会话构建在顶部的 Express 应用程序上,并可供我们使用。接下来,我们初始化 Passport,并将其传递给 Express 使用。
- 配置本地身份验证策略
在 Passport 中,身份验证策略指的是身份验证方法或插件,用于验证用户的凭证。我们将使用本地身份验证策略来验证用户的用户名和密码。
在配置本地策略之前,我们需要创建一个用户模型来存储用户数据。以下是一个简单的用户模型:
-- -------------------- ---- ------- ----- ----- - - - --- -- --------- -------- --------- -------------------------------------------------------------- - -- -------- ------------------ --------- - -- ------------------- ----- ---- - ------------ -- ---------- --- ---------- -- ------- - ------ -------------- ------ - -- ----------------------- ------ -------------- - --- -------- --------- -------------- --------- ------------- --- -
用户模型包含一个 findUser()
函数,该函数根据给定的用户名查找用户,并返回一个包含用户 ID、用户名和加密密码的对象。
接下来,我们需要在 Passport 中配置本地身份验证策略,如下所示:
-- -------------------- ---- ------- ----- ------------- - ----------------------------------- ----- ------ - ------------------ ---------------- -------------- ---------- --------- ----- -- - ------------------ ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - -- ------------------------------ --------------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------ ---------- ------ --- - ---
首先,我们引入 passport-local
模块,并创建一个新的本地身份验证策略。在 LocalStrategy
构造函数中,我们定义了两个参数:用户名和密码。
然后,我们调用 findUser()
函数,并传递用户名,该函数接受用户名并返回用户对象。
如果未找到用户,则会调用 done()
方法,并将 null
作为第一个参数传递,而将 false
和一个消息对象作为第二个参数传递。如果找到了用户,则会将用户对象传递给 done()
方法,并传递一个 null
。如果密码不匹配,则还会将 false
和消息对象传递给 done()
方法。
- 序列化和反序列化用户对象
每次用户登录时,Passport 都需要序列化并缓存该用户,以便在会话上下文中使用。在用户注销时,Passport 还需要反序列化这些数据并将其转换回用户对象,以便使用。
Passport 提供了两种方法来序列化和反序列化用户:passport.serializeUser()
和 passport.deserializeUser()
。
在以下示例中,我们将用户 ID 存储在会话中,以便我们可以将其与其他请求一起使用。
-- -------------------- ---- ------- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ---------------- ----- ----- -- - --------- ------ --- --- -------- ---------------- --------- - -- ------------------ ----- ---- - ------------ -- ---- --- ---- -- ------- - ------ -------------- ------ - -- ----------------------- ------ -------------- - --- -------- --------- -------------- --------- ------------- --- -
在 passport.serializeUser()
方法中,我们将用户对象的 ID 存储在会话中,以便在用户进行下一次请求时使用。在 passport.deserializeUser()
方法中,我们通过将 ID 传递给 findUserById()
来反序列化用户对象。
- 创建路由来处理身份验证
现在我们已经配置了本地身份验证策略,序列化和反序列化用户对象,我们可以创建一个路由来处理用户身份验证了。
下面是一个示例路由,使用户能够输入他们的用户名和密码,并将其与本地数据库中的用户信息进行比较:
app.post('/login', passport.authenticate('local', { failureRedirect: '/login' }), (req, res) => { res.redirect('/home'); });
在这个路由中,我们使用了 passport.authenticate()
方法来处理本地身份验证。该方法尝试使用我们上面定义的本地策略来处理身份验证,如果身份验证失败,则重定向到 /login
页面。
如果身份验证成功,则会调用第三个参数,该参数包含 req
对象和 res
对象。在传递这两个对象后,我们可以将用户重定向到其他页面,例如 '/home'
。如果未指定重定向 URL,则默认重定向到根路径。
- 创建自定义身份验证策略
除了本地身份验证策略之外,Passport 还支持其他各种身份验证策略,包括 OAuth 1.0 和 OAuth 2.0 策略。如果您需要使用这些方法之一,您可以使用 Passport 提供的策略构造函数来创建自定义策略。
以下是一个使用 OAuth 2.0 策略的示例:
-- -------------------- ---- ------- ----- -------------- - ------------------------------------ ---------------- ---------------- ----------------- ------------------------------------------- --------- --------------------------------------- --------- ------------------ ------------- ---------------------- ------------ ----------------------------------------- -- ------------- ------------- -------- ----- -- - -- -------------- - ---
在这个示例中,我们引入一个名为 passport-oauth2
的库,并使用它提供的 OAuth2Strategy
类来创建一个新的 OAuth 2.0 身份验证策略。在构造函数中,我们提供了必要的参数,例如 authorizationURL
、tokenURL
、clientID
和 clientSecret
。
我们还提供了一个回调函数,用于处理身份验证成功后的逻辑。在这个函数中,我们可以通过 profile
对象访问授权的用户配置文件,并将其存储在数据库中或在请求上下文中使用。
总结
在本文中,我们学习了如何使用 Passport 进行 Node.js 用户认证。我们已经学习了如何配置本地身份验证策略,序列化和反序列化用户对象以及如何使用一个简单的示例路由来处理身份验证。如果您需要使用不同类型的身份验证策略,我们还提供了一个使用 OAuth 2.0 策略的示例代码。希望这篇文章能够帮助您理解如何在 Node.js 项目中快速集成 Passport 来实现用户认证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64586063968c7c53b0ac2d83