在现代 web 应用程序中,用户认证是一个必不可少的功能。 Passport 是一个 Node.js 的身份验证中间件,它可以帮助我们在 Express.js 应用程序中实现用户身份验证和授权。在本文中,我们将学习如何在 Express.js 中使用 Passport 认证。
安装 Passport
在开始使用 Passport 之前,我们需要安装它。可以使用 npm 命令进行安装。
npm install passport passport-local
这将安装 Passport 及其本地策略。
配置 Passport
在配置 Passport 之前,我们需要在 Express.js 应用程序中引入 Passport 模块。
const passport = require('passport');
然后,我们需要配置 Passport。我们需要告诉 Passport 如何序列化和反序列化用户对象。序列化用户对象是指将用户对象转换为一个可存储的标识符,以便在用户登录后将其存储在会话中。反序列化用户对象是指将存储的标识符转换回用户对象。
-- -------------------- ---- ------- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----------------- ----- ----- -- - --------- ------ --- ---
在这个例子中,我们使用 MongoDB 数据库存储用户对象。我们使用 User.findById
方法从数据库中检索用户对象。done
回调函数用于在完成序列化或反序列化操作后通知 Passport。
接下来,我们需要告诉 Passport 使用哪种策略进行身份验证。在本例中,我们将使用本地策略进行身份验证。
-- -------------------- ---- ------- ----- ------------- - ----------------------------------- ---------------- -------------- ---------- --------- ----- -- - -------------- --------- -------- -- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - -- ------------------------------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------ ---------- ------ --- - ---
在这个例子中,我们使用 User.findOne
方法从数据库中检索用户对象。如果找到用户对象,则验证密码。如果密码验证成功,则使用 done
回调函数将用户对象返回给 Passport。否则,返回错误消息。
使用 Passport
在配置 Passport 后,我们需要在 Express.js 应用程序中使用它。我们需要使用 Passport 中间件将 Passport 添加到 Express.js 应用程序中。
-- -------------------- ---- ------- ----- --- - ---------- ------------------------------------ ------- --------- ----- ------- ------ ------------------ ----- ---- ------------------------------- ----------------------------
在这个例子中,我们使用 express-session
中间件来处理会话。我们将 Passport 初始化中间件和 Passport 会话中间件添加到 Express.js 应用程序中。
现在,我们可以使用 Passport 进行身份验证。我们可以使用 passport.authenticate
方法来验证用户凭据。例如,我们可以使用下面的代码来验证用户登录。
app.post('/login', passport.authenticate('local', { failureRedirect: '/login' }), (req, res) => { res.redirect('/'); });
在这个例子中,我们使用 passport.authenticate
方法来验证用户凭据。如果验证成功,则重定向到主页。否则,重定向到登录页面。
示例代码
下面是一个完整的 Express.js 应用程序,它使用 Passport 进行身份验证。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ------- - --------------------------- ----- --- - ---------- ----------------- ------- --------- ----- ------- ------ ------------------ ----- ---- ---------------------------- --------- ----- ---- ------------------------------- ---------------------------- ----- ----- - -- --- -- --------- ------- --------- ---------- -- - --- -- --------- ------- --------- ---------- --- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----- ---- - ----------------- -- ------- --- ---- ---------- ------ --- ---------------- ------------------------ --------- ----- -- - ----- ---- - ----------------- -- ------------- --- ---------- -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - -- -------------- --- --------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------ ---------- ------ ---- ------------ ----- ---- -- - --------------- --------- --- ----------------- ----- ---- -- - ---------- ----- --------------- -------------- ----- ------------------------ ------ ----------- ---------------- ------ ----- ------------------------ ------ --------------- ---------------- ------ ----- ------ ------------- ---------- ---- ------ ------- --- --- ------------------ ------------------------------ - ---------------- -------- --- ----- ---- -- - ------------------ --- ---------------- -- -- - -------------------- --- --------- -- ---- -------- ---
这个例子中,我们使用本地策略进行身份验证。我们使用一个简单的数组来存储用户对象。在实际应用程序中,我们应该使用数据库来存储用户对象。
结论
在本文中,我们学习了如何在 Express.js 应用程序中使用 Passport 进行身份验证。我们学习了如何配置 Passport,如何使用 Passport 中间件,以及如何使用 Passport 进行身份验证。我们还提供了一个完整的 Express.js 应用程序示例,它使用 Passport 进行身份验证。现在,你可以在自己的应用程序中使用 Passport 进行身份验证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/673c92a1face55d72054822c