在现代 web 应用程序中,用户认证是必不可少的功能。有许多开源的认证库可以使用,其中 Passport 是最流行的之一。它是一个可扩展的 Node.js 应用程序,可用于通过多种认证方式进行用户认证。在本文中,我们将探讨如何在 Express.js 中使用 Passport 实现用户身份认证。
安装 Passport 和相关模块
在开始之前,我们需要确保安装了 Node.js 和 Express.js。然后,我们可以使用 npm 安装 Passport 和相关模块:
npm install passport passport-local express-session
解释一下上述命令:
- passport 是 Passport.js 库。
- passport-local 是 Passport.js 库的本地策略。
- express-session 是会话中间件,用于在客户端和服务器之间管理会话状态。
配置 Passport 中间件
接下来我们需要在 Express.js 中配置 Passport 中间件。在 app.js 文件中添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------- - --------------------------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- --- - ---------- ----------------- ------- ------------------ ------- ------ ------------------ ---- ---- ------------------------------- ---------------------------- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----------------- ----- ----- -- - --------- ------ --- --- ---------------- --------------- -------------- -------- -------------- ---------- -- ------- --------- ----- -- - -------------------- ------- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------- - -- ------------------------------- - ------ ---------- ------- - ------ ---------- ------ --- ----
让我们逐步解释代码。首先,我们需要导入所需的 JavaScript 库。在这个例子里,我们导入了 Express.js、express-session、passport 和 passport-local。
然后,我们为 Express.js 应用程序配置了 session 和 Passport 中间件。session()
函数返回中间件,用于管理客户端和服务器之间的会话状态。因为我们的会话状态需要在客户端和服务器之间共享,所以我们需要将 secret
设置为一个加密密钥。passport.initialize()
和 passport.session()
是 Passport 中间件,用于设置和存储用户的认证状态。
接下来,我们需要设置序列化和反序列化功能来支持用户认证。序列化函数将用户对象转换为唯一的标识符,反序列化函数将标识符转换回用户对象。这个过程让 Passport 能够存储和提取用户对象。
最后,我们需要配置本地策略(即使用用户名和密码进行身份验证)。在这个例子中,我们使用了本地策略,并通过 findOne()
函数查询用户数据库以查找匹配的用户。如果找到了用户,我们将调用 validPassword()
函数来验证密码,如果验证成功,则 Passport 将设置用户的认证状态。如果未找到用户或密码不正确,则 Passport 会将响应的状态设置为 false
。
配置路由
接下来,我们需要设置路由,用于处理用户登录、注册等网页上的操作。在 app.js 文件中添加以下代码:
-- -------------------- ---- ------- ------------ ----- ---- -- - ------------------- ------ ----------- --- ----------------- ----- ---- -- - -------------------- --- ------------------ ------------------------------ - ---------------- ---- ---------------- --------- ------------- ---- ---- ------------------ ----- ---- -- - --------------------- --- ------------------- ----- ---- ----- -- - ----- ------- - --- ------ ------ --------------- --------- ----------------- --- ------------------ -- - -- ----- - ------ ---------- - ------------------ --- --- ------------------ ----- ---- -- - ------------- ------------------ ---
在这段代码中,我们定义了根目录、登录、注册和注销路由。在根目录路由中,我们使用 render()
方法渲染 index.ejs 模板,并将认证的用户对象传递给模板。在登录和注册路由中,我们使用 render()
方法来渲染登录和注册页面。在 authenticate()
方法中,我们使用本地策略进行身份验证。如果身份验证成功,则将用户重定向到根目录,并且在失败的情况下重定向到登录页面。在注册路由中,我们创建了一个新用户对象,并将其保存到数据库中。在注销路由中,我们调用 logout()
方法来清除用户的认证状态。
模板和视图
最后,让我们创建模板和视图文件。在 views 目录中,我们将创建以下文件:
views/index.ejs:
-- -------------------- ---- ------- --------- ----- ------ ------ ------------------ ------------ ------- ------ -- -- ------ - -- ---------- --- ---------- -- - -- ----------------------------- -- - ---- - -- ---------- - -- ----------------------- -- -- ----------------------------- -- - -- ------- -------
views/login.ejs:
-- -------------------- ---- ------- --------- ----- ------ ------ ------------------ ------------ ------- ------ -------------- -- -- --------- - -- ------ ------- ------ -- - -- ----- ------------- ---------------- --------------------- ------ ------------ ----------------- ------------------------ ------ --------------- -------------------- ------ ------------- -------------- ------- ------- -------
views/signup.ejs:
-- -------------------- ---- ------- --------- ----- ------ ------ ------------------ ------------ ------- ------ --------------- -- -- --------- - -- ------ ------- ------ -- - -- ----- ------------- ----------------- --------------------- ------ ------------ ----------------- ------------------------ ------ --------------- -------------------- ------ ------------- --------------- ------- ------- -------
在这些模板中,我们使用 EJS 模板语言来定义视图。在 index.ejs 模板中,我们根据用户是否已登录来显示欢迎信息。在登录和注册模板中,我们使用表单和 POST 方法来处理用户输入。
运行应用程序
现在,运行应用程序并在浏览器中输入 http://localhost:3000
来访问页面。在访问登录或注册页面时,您应该被重定向到特定的 URL。当您输入错误的用户名或密码时,系统应该返回错误消息。当您成功登录后,您应该被重定向到主页,并且您应该看到欢迎消息。当您注册新用户后,您应该能够登录并访问主页。
总结
在本文中,我们学习了在 Express.js 中使用 Passport 实现用户认证。我们了解了如何配置 Passport 中间件和本地策略,并定义了相关的路由和视图。现在,您应该能够使用 Passport 来管理用户的身份验证,并在自己的 web 应用程序中实现安全的用户体验。别忘了,始终需要小心保护和管理用户的敏感信息和凭证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6495e88648841e98942ea34a