随着 Web 应用程序的复杂性和数据泄露的频繁发生,用户认证和授权变得非常重要。Node.js 提供了一个称为 Passport 的中间件,它提供了一种简单且灵活的方法来保护您的应用程序。
什么是 Passport?
Passport 是 Node.js 中的身份验证中间件,它允许您为 Web 应用程序添加认证策略。它支持本地身份验证、授权(例如,Facebook、Twitter、Google 和其他身份验证服务)等。
尽管 Passport 是轻量的,但其确实拥有足够的功能,可使它成为您的 Web 应用程序中的完美身份验证和授权解决方案。
Passport 的一般结构
在使用 Passport 之前,需要先安装它。可以使用 npm 进行安装:
npm install passport
Passport 的常见模式分为两个部分:
- 页面和路由
- Passport 配置
既然了解了 Passport 的基本结构,我们现在可以重点研究在 Node.js 中使用 Passport 进行用户身份验证和授权。
身份验证
在 Web 应用程序中,身份验证是一种确认用户身份信息的过程。此过程通过搜索数据库(通常加密存储)来确认用户是否具有访问权限。Passport 为我们提供了检查用户是否有权访问特定资源的简单方法。
Passport-Local
既然我们已经了解了通过本地数据库进行身份验证的重要性,那么就是使用 Passport-Local 的时候了。正如其名称所示,Passport-Local 适用于本地身份验证功能。
安装 Passport-Local:
npm install passport-local
配置 Passport 并使用 LocalStrategy:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ---- - -------------------------- -------------- - ------------------ - -- ----- ------------------------------------- ----- - ---------- --------- --- -- ------ ------------------------------------- ----- - ----------------- ------------- ----- - --------- ------ --- --- -- ---- --------------------------- --- --------------- ------------- - -------- -- -------- ------------- - ----------- -- ------- ----------------- - ---- -- ------------- ------ --------- ----- - -- ------ -------------- ------------- - ----- -- ------------- ----- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ ------------------------- ---------- - -- ------------------------------- - ------ ---------- ------ ------------------------- --------- - ------ ---------- ------ --- ---- --
在 req.flash() 函数中,我们将从 Passport 回传的信息存储到 req.session 中。
在上文中,我们定义了 LocalStrategy。它使用最常用的字段 email 和 password 进行身份验证。如果用户的用户名、密码无效,当然就不会被允许访问。在上文中,登录回调函数中的 done() 仅仅是通知 Passport 用户是否被允许访问。
我们在拿到 HTML 表单的访问请求时,需要验证身份。我们可以使用 Passport 的中间件来进行身份验证,这样我们就可以在任何路由中轻松验证用户的身份信息。
以下是一个身份验证的示例,请注意上文中 serialize 和 deserialize 函数的用法:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ------ - ----------------- ----- -------- - -------------------- --------------------- ------------------------------------ - --------------- - --------- -- --------- ------------ - ---- -- --------------- ------- ------- ------- ---- --- ------------- ---- - -- ------------- ------------------ ---
在上述代码片段中,我们通过将 passport.authenticate() 函数作为中间件来更新路由的模型。当登录表单提交时,此模型触发身份验证回调。如果身份验证结果为失败,则重定向到 login 页面并将 err 消息作为变量传递给 handlebars 模板。
如果身份验证成功,我们就简单地重定向到我们的主页或任何其他身份验证后的页面。
控制访问权限并授权
当某个用户登录并被身份验证之后,应用程序需要控制他们所能访问的页面和内容。这就是授权的作用,它为我们提供了更加精细的手段进行筛选和策略。
其中,常见的授权策略有:
- 基于角色的授权
- 基于资源的授权
基于角色的授权
基于角色的授权让我们可以通过所属组来授权某个用户的访问,最常见的例子是不同用户类型的权限不同。例如,普通用户和管理员用户能够访问不同的页面和功能。
- 创建 User 模型以存储以下数据
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ------------------------- ----- ---------- - ----------------- ----- - - ----- - ------- -------- - ------- -- ----- ------ --- -- ---------- ------------------------------- - ------------------ - ------ ------------------------- ---------------------- ------ -- -- ------ -------------------------------- - ------------------ - ------ ---------------------------- --------------------- -- -- ------ --- ----- --- ----- --- ------ -- -- --- --- -------------- - ---------------------- ------------
- 将本地角色设置为 User,则我们可以很容易地在 login Strategy 中使用之前定义的回调来验证用户并授权访问级别。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- ---- - -------------------------- -------------- - ------------------ - -- ----- ------------------------------------- ----- - ---------- --------- --- -- ------ ------------------------------------- ----- - ----------------- ------------- ----- - --------- ------ --- --- -- ---- --------------------------- --- --------------- ------------- - -------- ------------- - ----------- ----------------- - ---- -- ------------- ------ --------- ----- - -------------- ------------- - ----- -- ------------- ----- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ ------------------------- ---------- - -- ------------------------------- - ------ ---------- ------ ------------------------- --------- - ------ ---------- ------ --- ---- ---------------------------- --- --------------- ------------- - -------- ------------- - ----------- ----------------- - ---- -- ------------- ------ --------- ----- - --------------------------- - -------------- ------------- - ----- -- ----- ------------- ----- - -- --------- --- --- ---- -- ------- ----- --------------- - ------------- ---- ----- - -- ---------------------- -- -------------- --- ------ -- ------------- --- --------- -- ------------------------ ------ ------- -- ----------- ----------------------- -- ----- ------- - ------------- ---- ----- - -- ---------------------- -- ------------- --- -------- -- -------------- --------- ------ ------- -- --------- ------------------ -- --
使用上述代码,我们可以在我们的控制器中使用 isAuthenticated 和 isAdmin。例如:
app.get('/admin', passportConfig.isAdmin, (req, res, next) => { res.render('admin'); });
Passport 的强大功能为身份验证和授权提供了强大的支持。作为开发人员,我们必须时刻关注应用程序的安全性。了解和使用 Passport 不仅可以帮助您轻松地添加身份验证和授权功能,而且还可以帮助您更好地实现应用程序的安全性,确保数据最大程度保护。
结论
Passport 为我们提供了一个简单而强大的身份验证和授权解决方案。同时,它还提供了许多有用的策略选项,包括本地策略、Facebook 策略、Twitter 策略、GitHub 策略以及其他许多身份验证解决方案。这使得 Passport 成为开发 Web 应用程序所必需的一个工具。
在本文中,我们仅覆盖了 Passport 的一部分功能。花些时间仔细研究其官方文档,您将能够学习到更多关于 Passport 的强大功能、身份验证和授权方法,以及如何将它们应用在您的应用程序中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672e8da5eedcc8a97c89fbfa