介绍
在现代 Web 应用程序中,身份验证是至关重要的一个功能。它可以确保用户的安全,防止信息泄漏和攻击,同时也可以为应用程序提供更多的功能和用户体验。在前端实现身份验证非常常见,这需要一些工具和库来让它变得更加简单和可信。
Passport.js 是一个非常流行的 Node.js 应用程序中的验证库。它提供了不同的验证策略,例如本地验证、社交媒体验证等等。在本文中,我们将探讨如何使用 Passport.js 与 Express.js 结合实现身份验证。
注意:本文需要读者具有基本的 Node.js 和 Express.js 开发知识,如果你还不了解,请先学习相关知识。
安装 Passport.js
首先,让我们安装 Passport.js 库。在终端中执行以下命令:
npm install passport --save
此命令将在您的项目中安装 Passport.js 库。此库提供了身份验证的基本功能,例如定义验证策略、验证流程等等。
安装 Passport.js 的验证策略
在 Passport.js 中,我们需要为每种验证类型(例如本地验证和社交媒体验证)选择和安装相应的验证策略。让我们先安装本地验证策略 passport-local
。
在终端中执行以下命令:
npm install passport-local --save
此命令将安装 passport-local
策略,使我们可以在 Express.js 中添加本地身份验证功能。
实现身份验证
好的,现在我们已经安装了必要的库和策略,我们可以着手实现身份验证了。
配置 Passport.js
首先,我们需要在我们的 app.js 或者 index.js`(或其他入口文件)配置 Passport.js。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- -- -- -------- ------------------------------- -- ------ ---------------- --------------- -------------- ------- -- ------------------ --------- ----- - -- ----------- - ---
在上面代码中,我们首先引入了 passport
库以及 passport-local
策略。然后,我们配置 Passport.js,使用 passport.initialize()
初始化 Passport.js。接下来,我们使用 passport.use()
指定本地身份验证策略。在下面的代码中,我们将使用 passport-local
策略,并指定验证的字段为 email
。然后,在策略的回调函数中,我们可以在这里添加验证逻辑。
对于密码建议使用bcrypt等库进行密码加密处理,以增加密码安全性。
实现注册功能
下面,让我们看一下如何实现注册功能。
-- -------------------- ---- ------- ------------------- ----- ---- ----- -- - ------------------------------------- ----- ----- ----- -- - -- ---- -- ----- - ------ ---------------------- -------- ----------- --- - -- ------ -- ------- - ------ ---------------------- -------- ------------ --- - -- ---- ------ ---------------------- -------- ------ --- ------- ---- ------ ---
在上面的代码中,我们首先添加了一个 POST /signup 路由,当用户注册时将触发此路由。在路由处理程序中,我们使用 passport.authenticate()
方法,指定验证的策略为 local-signup
。这个 local-signup
策略是我们在 Passport.js 配置中定义的策略,并且它将在用户注册时使用。注意,我们将 req
, res
, and next
传递给了 passport.authenticate()
方法,这是必须的。然后,在验证完成后,如果出现错误,我们将返回一个 500 状态码和错误消息。如果用户重复,我们将返回一个 400 状态码和友好错误消息。最后,在注册成功时,我们将返回 200 状态码和注册成功消息。
在我们讨论的策略配置函数中done({} , user/ false / error)
按照此格式把不同的返回结果传递,第一个对象为空,第二个表示等待具体的验证结果(比如该用户名是否存在或登录结果)
-- -------------------- ---- ------- ---------------------------- --- --------------- -- ------- -------------- -------- -------------- ----------- -- ---------------- ------------------ ---- -- ------------- ------ --------- ----- - -- ---------- -------------- -------------- ----- -- ------------- ----- - -- ----------- -- ----- - ------ ---------- - -- --------------- -- ------ - ------ ---------- ------ - -------- ------------ --- - ---- - ----- ------- - --- ------- ------------------- - ------ ---------------------- - ------------------------------- ----------- -------------------------- - -- ----- - ----- ---- - ------ ---------- --------- --- - --- ----
在上面的代码中我们使用了'local-signup'策略其中一个验证功能,定义了验证时使用的字段,而指定的回调函数则具有验证功能。其中第一个参数是req,这是因为,有时需要再本地验证的字段外添加其他验证参数。 在验证函数中,我们在数据库中查找是否存在相同的用户名,如果存在,则返回一个错误消息。否则,我们创建一个新的用户对象,并保存到数据库中。如果用户创建成功,我们将使用 done()
方法将其返回。
实现登录功能
现在,我们已经了解了如何实现注册功能,接下来让我们来看一下如何实现登录功能。
-- -------------------- ---- ------- ------------------ ----- ---- ----- -- - ------------------------------------ ----- ----- ----- -- - -- ----- - ------ ---------------------- -------- ----------- --- - -- ------- - ------ ---------------------- -------- ------------ --- - --------------- ------------- - -- ----- - ------ ---------------------- -------- ----------- --- - ------ ---------------------- -------- ------ --- --- ------- ---- ------ ---
在上面的代码中,我们添加了一个 POST /login 路由。在这个路由处理程序中,我们使用 passport.authenticate()
方法指定验证的策略为 local-login
。这个策略是我们在 Passport.js 配置中定义的策略,并且它将使用登录功能。在验证完成后,如果出现错误,我们将返回一个 500 状态码和错误消息。如果用户不存在,我们将返回一个 401 状态码和错误消息。最后,在成功登录时,我们将使用 req.logIn()
方法将用户存储到会话中,并返回 200 状态码和登录成功消息。
下面是我们在 Passport.js 配置中添加的策略,它将用于处理本地登录请求。
-- -------------------- ---- ------- --------------------------- --- --------------- -- ------- -------------- -------- -------------- ----------- -- ---------------- ------------------ ---- -- ------------- ------ --------- ----- - -- ------------ -------------- -------------- ----- -- ------------- ----- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ------------ --- - -- ------------------------------- - ----------------------- ------ ---------- ------ - -------- ------------ --- - ------ ---------- ------ --- ----
在上面的代码中,我们对密码进行了一个 validPassword()
方法的调用,以确保密码正确。这个 validPassword()
方法需要在我们的 User
对象中实现,以便我们可以在验证用户时使用它。
现在你可以在 node.js 的命令行下启动项目并发起POST请求测试验证:
- 注册一个新用户:
curl -H "Content-Type: application/json" -X POST -d '{"email": "test@gmail.com","password": "password"}' http://localhost:3000/signup
返回
{ "message": "注册成功" }
- 登录:
curl -H "Content-Type: application/json" -X POST -d '{"email": "test@gmail.com","password": "password"}' http://localhost:3000/login
返回
{ "message": "登录成功" }
- 验证失败:
curl -H "Content-Type: application/json" -X POST -d '{"email": "test1@gmail.com","password": "password"}' http://localhost:3000/login
返回
{ "message": "用户名或密码不正确。" }
总结
Passport.js 是一个非常有用的库,它提供了不同的验证策略,使我们可以为我们的应用程序添加一个高效的身份验证功能。在这篇文章中,我们讨论了如何使用 Passport.js 和 Express.js 结合实现身份验证,包括注册和登录功能,以及如何指定验证策略和配置 Passport.js。我们还提供了一些示例代码以帮助你更好地理解本文所述内容。希望这篇文章对你有所帮助!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c4d81e83d39b488183d30a