在现代 Web 应用程序中,用户认证是一个必不可少的功能。Express.js 是一个灵活的 Web 应用程序框架,而 Passport.js 是一个流行的用户认证库,它可以与 Express.js 无缝集成。本文将介绍如何使用 Express.js 和 Passport.js 实现用户认证。
安装和配置 Express.js 和 Passport.js
在开始之前,我们需要先安装和配置 Express.js 和 Passport.js。首先,我们需要在本地安装 Node.js 和 npm。然后,我们可以使用以下命令在项目文件夹中初始化一个新的 Node.js 应用程序:
npm init
然后,我们需要安装 Express.js 和 Passport.js:
npm install express passport passport-local express-session --save
以上命令将安装 Express.js、Passport.js、Passport.js 的本地策略和 Express.js 的会话中间件。
实现用户认证
接下来,我们将实现一个简单的用户认证系统。我们将使用 Passport.js 的本地策略,该策略使用用户名和密码进行身份验证。
首先,我们需要在 Express.js 应用程序中配置 Passport.js:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------- - --------------------------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- --- - ---------- -- -- ------- --- ----------------- ------- --------- ------- ------ ------------------ ----- ---- -- -- ----------- --- ------------------------------- ---------------------------- -- -- ----------- ---- ---------------- -------------- ------------------ --------- ----- - -- ------------- - --- -- ------- ------------------------------------- ----- - ---------- --------- --- -- -------- ------------------------------------- ----- - -- ----------- ---
我们首先配置了 Express.js 的会话中间件和 Passport.js 的中间件。然后,我们使用 passport.use()
函数配置了 Passport.js 的本地策略。在本地策略中,我们可以实现用户身份验证逻辑。
接下来,我们需要实现序列化和反序列化逻辑。序列化用户对象时,我们只需要将用户 ID 存储在会话中。反序列化用户对象时,我们需要根据用户 ID 检索用户对象。
接下来,我们需要实现用户身份验证逻辑。在本例中,我们将使用一个简单的 JavaScript 对象来存储用户信息。在生产环境中,您应该将用户信息存储在数据库中。
-- -------------------- ---- ------- ----- ----- - - - --- -- --------- ------- --------- ---------- -- - --- -- --------- ------- --------- ---------- - -- ---------------- -------------- ------------------ --------- ----- - ----- ---- - ------------ -- ---------- --- -------- -- ---------- --- ---------- -- ------ - ------ ---------- ------ - ---- - ------ ---------- ------ - -------- ---------- -------- -- ---------- --- - - ---
在本例中,我们使用 Array.find()
方法查找具有指定用户名和密码的用户。如果找到用户,则将其传递给 done()
回调函数。否则,我们将传递一个错误消息。
接下来,我们需要实现反序列化逻辑:
passport.deserializeUser(function(id, done) { const user = users.find(u => u.id === id); if (user) { done(null, user); } else { done(new Error('User not found.')); } });
在本例中,我们使用 Array.find()
方法根据用户 ID 查找用户对象。如果找到用户,则将其传递给 done()
回调函数。否则,我们将传递一个错误消息。
现在,我们已经完成了用户认证系统的配置。接下来,我们需要实现路由和视图。
实现路由和视图
我们将使用以下路由和视图来实现用户认证系统:
-- -------------------- ---- ------- -- ------ ----------------- ------------- ---- - -------------------- --- -- -------- ------------------ ------------------------------ - ---------------- ---- ---------------- -------- ---- -- ---- ------------ ------------- ---- - -- ----------------------- - ------------------- - ----- -------- --- - ---- - ----------------------- - --- -- ------ ------------------ ------------- ---- - ------------- ----------------------- ---
在上面的代码中,我们定义了四个路由:
/login
:用于渲染登录表单的 GET 路由。/login
:用于处理登录表单提交的 POST 路由。我们使用passport.authenticate()
函数来处理身份验证。如果身份验证成功,则重定向到主页。否则,重定向到登录表单。/
:用于渲染主页的 GET 路由。如果用户已经通过身份验证,则渲染主页。否则,重定向到登录表单。/logout
:用于处理注销请求的 GET 路由。我们使用req.logout()
函数来注销用户会话。
现在,我们需要实现视图。我们将使用 EJS 模板引擎来渲染视图。在本例中,我们将使用以下两个视图:
login.ejs
:用于渲染登录表单。index.ejs
:用于渲染主页。
以下是 login.ejs
的示例代码:
-- -------------------- ---- ------- --------- ----- ------ ------ -------------------- ------- ------ -------------- -- -- --------- - -- ------ ------- ------ -- - -- ----- --------------- -------------- ----- ------------------------ ------ ----------- ---------------- ------ ----- ------------------------ ------ --------------- ---------------- ------ ----- ------ ------------- -------------- ------ ------- ------- -------
在上面的代码中,我们定义了一个简单的登录表单。如果身份验证失败,我们将在表单上显示错误消息。
以下是 index.ejs
的示例代码:
-- -------------------- ---- ------- --------- ----- ------ ------ ------------------- ------- ------ ----------- --- ------------- -------- -- ------------------------- ------- -------
在上面的代码中,我们向用户显示欢迎消息,并提供一个注销链接。
运行应用程序
现在,我们已经完成了用户认证系统的实现。我们可以使用以下命令运行应用程序:
node app.js
然后,我们可以在浏览器中访问 http://localhost:3000/login
来访问登录表单。如果我们输入正确的用户名和密码,我们将被重定向到主页。如果我们单击注销链接,我们将被重定向到登录表单。
结论
在本文中,我们介绍了如何使用 Express.js 和 Passport.js 实现用户认证。我们首先配置了 Express.js 和 Passport.js,然后实现了用户身份验证逻辑和路由和视图。通过使用本地策略,我们可以轻松地实现基于用户名和密码的身份验证。在生产环境中,您应该将用户信息存储在数据库中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675cf654e5138b922288e2a6