简介
在现代 Web 应用程序中,身份验证是一个非常重要的功能。Express.js 是一个流行的 Node.js Web 框架,而 Passport 是一个可扩展的身份验证库,可以轻松地与 Express 集成。在本文中,我们将深入了解如何使用 Express.js 和 Passport 实现身份验证功能。
准备工作
在开始之前,需要确保已经安装了 Node.js 和 npm。如果没有安装,请先从官网下载并安装。
然后,我们需要创建一个新的 Express.js 应用程序。打开终端并执行以下命令:
$ mkdir myapp $ cd myapp $ npm init -y $ npm install express --save
接下来,在 myapp
文件夹中创建一个新的文件 index.js
,并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- --- - --------- ------------ ----- ---- -- - --------------- -------- -- ---------------- -- -- - ------------------- ------- -- ---- ------ --
现在,我们已经有了一个简单的 Express.js 应用程序,它将在 http://localhost:3000
上监听请求并响应 "Hello World!"。
安装 Passport
接下来,我们需要安装 Passport。打开终端并执行以下命令:
$ npm install passport passport-local --save
这将安装 Passport 及其本地策略。
实现身份验证
现在,我们可以开始实现身份验证了。我们将使用 Passport 的本地策略来验证用户的用户名和密码。在 index.js
中添加以下代码:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- ------------- - ---------------------------------- ---------------- -------------- ---------- --------- ----- -- - -- --------- --- ------- -- -------- --- ----------- - ------ ---------- - --------- ------- -- - ---- - ------ ---------- ------ - - -- ------------------------------ ------------------ ------------------------------- ----- ---- -- - ---------------- -- -------------- --
首先,我们导入了 Passport 和本地策略。然后,我们使用 passport.use()
方法来定义一个本地策略。本地策略需要一个验证函数,该函数将接收用户名和密码,并在验证成功时调用 done(null, user)
,其中 user
是一个包含用户信息的对象。在验证失败时,调用 done(null, false)
。
接下来,我们使用 passport.initialize()
中间件来初始化 Passport。最后,我们定义了一个 /login
路由,并使用 passport.authenticate()
方法来验证用户名和密码。如果验证成功,将继续执行路由处理程序并响应 "Logged in successfully"。
现在,我们已经可以使用本地策略实现身份验证了。但是,每次请求都需要手动调用 passport.authenticate()
,这很麻烦。接下来,我们将使用 Passport 的序列化和反序列化功能来实现持久化登录状态。
实现持久化登录状态
为了实现持久化登录状态,我们需要在 Passport 中定义序列化和反序列化函数。在 index.js
中添加以下代码:
-- -------------------- ---- ------- ----------------------------- ----- -- - ---------- -------------- -- ----------------------------------- ----- -- - -- --------- --- -------- - ---------- - --------- ------- -- - ---- - -------- ----------- --- -------- - --
首先,我们使用 passport.serializeUser()
方法来定义一个序列化函数。序列化函数将接收一个用户对象,并将其转换为一个唯一的标识符,以便将其存储在会话中。在这里,我们将使用用户名作为唯一标识符。
接下来,我们使用 passport.deserializeUser()
方法来定义一个反序列化函数。反序列化函数将接收一个唯一标识符,并将其转换回用户对象。在这里,我们检查用户名是否为 "admin",如果是,则返回一个包含用户名的对象,否则抛出一个错误。
现在,我们已经定义了序列化和反序列化函数。接下来,我们需要在 Express.js 应用程序中启用会话支持。在 index.js
中添加以下代码:
const session = require('express-session') app.use(session({ secret: 'mysecret', resave: false, saveUninitialized: false }))
这将启用会话支持,并使用 "mysecret" 作为加密密钥。resave
和 saveUninitialized
选项设置为 false
,以确保不会在每个请求上重新保存会话。
现在,我们已经启用了会话支持,并定义了序列化和反序列化函数。接下来,我们需要更新 /login
路由以启用持久化登录状态。在 index.js
中添加以下代码:
app.post('/login', passport.authenticate('local'), (req, res) => { req.session.user = req.user res.send('Logged in successfully') })
在验证成功后,我们将用户对象存储在会话中。这将使用户在下一次请求时自动登录。现在,我们已经成功实现了持久化登录状态。
完整代码
-- -------------------- ---- ------- ----- ------- - ------------------ ----- -------- - ------------------- ----- ------------- - ---------------------------------- ----- ------- - -------------------------- ----- --- - --------- ---------------- -------------- ---------- --------- ----- -- - -- --------- --- ------- -- -------- --- ----------- - ------ ---------- - --------- ------- -- - ---- - ------ ---------- ------ - - -- ----------------------------- ----- -- - ---------- -------------- -- ----------------------------------- ----- -- - -- --------- --- -------- - ---------- - --------- ------- -- - ---- - -------- ----------- --- -------- - -- ----------------- ------- ----------- ------- ------ ------------------ ----- --- ------------------------------ --------------------------- ------------ ----- ---- -- - --------------- -------- -- ------------------ ------------------------------- ----- ---- -- - ---------------- - -------- ---------------- -- -------------- -- ---------------- -- -- - ------------------- ------- -- ---- ------ --
结论
在本文中,我们深入了解了如何使用 Express.js 和 Passport 实现身份验证功能。我们学习了如何使用 Passport 的本地策略、序列化和反序列化函数以及持久化登录状态。这些知识对于实现现代 Web 应用程序中的身份验证功能非常重要。希望本文对你有所帮助!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6761172e03c3aa6a560960c5