Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js

使用 Passport 验证 Node.js 应用程序

by
Read Time:11 minsLanguages:

Chinese (Simplified) (中文(简体)) translation by Fuhuan (you can also view the original English article)

为任何应用程序实现身份验证功能都是一项艰巨的任务,Node.js 应用程序也不例外。

在本教程中,我们将从头开发一个 Node.js 应用程序并使用一个相对较新但非常流行的身份验证插件 - Passport 来处理我们的身份验证问题。

Passport 的文档将其描述为 “Node 的简单,不显眼的身份验证插件”,这是正确的。

通过将自身作为插件提供,Passport 在将 Web 应用程序的其他问题与其身份验证需求分离方面做得非常出色。 它允许将 Passport 轻松配置到任何基于 Express 的 Web 应用程序中,就像我们配置其他 Express 插件一样,例如日志记录,正文解析,cookie 解析,会话处理等。

本教程假设你对 Node.js 和 Express 框架有基本的了解,并尝试将注意力集中在身份验证上,尽管我们从头开始创建示例 Express 应用程序并通过向其添加路由并验证其中一些路由信息来进行。

认证策略

Passport 为我们提供了 140 多种身份验证机制可供选择。 你可以针对本地 / 远程数据库实例进行身份验证,或使用 OAuth 提供程序对 Facebook,Twitter,Google 等进行单点登录,以对你的社交媒体帐户进行身份验证,或者你可以从支持身份验证的广泛提供商列表中进行选择使用 Passport 并为其提供节点模块。

但不要担心:你不需要包含应用程序不需要的任何策略 / 机制。 所有这些策略是相互独立的,并打包为单独的节点模块,默认情况下,在安装 Passport 的插件时不包括这些模块:npm install passport

在本教程中,我们将使用 Passport 的本地身份验证策略,并针对本地配置的 Mongo 数据库实例对用户进行身份验证,并将用户详细信息存储在数据库中。 要使用本地身份验证策略,我们需要安装 passport-local 模块:npm install passport-local

但是:在启动终端并开始执行这些命令之前,让我们从头开始构建一个 Express 应用程序并添加一些路由(用于登录,注册和主页),然后尝试添加我们的身份验证插件。 请注意,我们将在本教程中使用 Express 4,但稍微有些不同, Passport 也可以与 Express 3 一起使用。

设置应用程序

如果你还没有,那么请继续安装 Express&express-generator,通过在终端上执行 express passport-mongo 来生成样板应用程序。  生成的应用程序结构应如下所示:

Initial Application StructureInitial Application StructureInitial Application Structure

让我们删除一些我们不会使用的默认功能 - 继续并删除 users.js 路由并从 app.js 文件中删除它的引用。

添加项目依赖项

打开 package.json 并添加护照和本地护照模块的依赖项。

由于我们将在 MongoDB 中保存用户详细信息,因此我们将使用 Mongoose 作为对象数据建模工具。 将依赖项安装并保存到 package.json 的另一种方法是输入:

package.json 应如下所示:

Added Mongoose DependenciesAdded Mongoose DependenciesAdded Mongoose Dependencies

现在,安装所有依赖项并通过执行 npm install && npm start 运行样板应用程序。 它现在将下载并安装所有依赖项,并将启动节点服务器。 你可以在 http:// localhost:3000 / 查看基本的 Express 应用程序,但现在没有什么看头。

很快,我们将通过创建一个完整的应用程序来改变这一点,该应用程序要求显示新用户的注册页面,注册用户的登录,并使用 Passport 对注册用户进行身份验证。

创建 Mongoose 模型

由于我们将在 Mongo 中保存用户详细信息,因此我们在 Mongoose 中创建一个用户模型,并将其保存在我们的应用程序中的 models / user.js 中。

基本上,我们正在创建一个 Mongoose 模型,使用它我们可以在底层数据库上执行 CRUD 操作

配置 Mongo

如果你没有在本地安装 Mongo,我们建议你使用云数据库服务,例如 Modulus 或 MongoLab。  使用这些实现创建一个有效的 MongoDB 实例不仅是免费的,而且只需点击几下即可。

在其中一个服务上创建数据库后,它将为你提供数据库 URI,如 mongodb:// : @ novus.modulusmongo.net:27017 / ,可用于执行 CRUD 操作在数据库上。  最好将数据库配置保存在一个单独的文件中,该文件可以在需要时启动。 因此,我们创建一个节点模块 db.js,它看起来像:

如果你像我一样,你正在使用本地 Mongo 实例,那么可以启动 mongod 守护进程了,db.js 应该看起来像

现在我们在 app.js 中使用此配置并使用 Mongoose API 连接到它:

配置 Passport

Passport 只提供了处理身份验证的机制,留下了自己实现会话处理的责任,为此我们将使用快速会话。 在配置路由之前打开 app.js 并粘贴下面的代码:


这是必要的,因为我们希望我们的用户会话本质上是持久的。 在运行应用程序之前,我们需要安装 express-session 并将其添加到 package.json 中的依赖项列表中。 要做到这一点,请键入 npm install --save express-session

序列化和反序列化用户实例

Passport 还需要从会话存储中序列化和反序列化用户实例以支持登录会话,以便每个后续请求都不包含用户凭据。 它为此提供了两个方法 serializeUser 和 deserializeUser:

使用 Passport 策略

我们现在将定义 Passport 处理登录和注册的策略。 它们中的每一个都是 Passport 的本地身份验证策略的实例,并且将使用 passport.use()创建 功能。 我们使用 connect-flash 通过提供可以在出错时显示给用户的 flash 消息来帮助我们处理错误。

登录策略

登录策略如下所示:

passport.use()的第一个参数是策略的名称,该策略将在以后应用时用于标识此策略。 第二个参数是你要创建的策略类型,这里我们使用用户名密码或 LocalStrategy。 需要注意的是,默认情况下,LocalStrategy 希望在用户名和密码参数中找到用户凭据,但它允许我们使用任何其他命名参数。 所述 passReqToCallback 配置变量允许我们访问的请求的回叫对象,从而使我们能够使用与该请求相关联的任何参数。

接下来,我们使用 Mongoose API 在我们的基础用户集合中查找用户,以检查用户是否是有效用户。 我们的回调中的最后一个参数:done 表示一个有用的方法,使用它可以向 Passport 模块发出成功或失败的信号。 要指定失败,第一个参数应该包含错误,或者第二个参数应该计算为 false。 由于密码本质上是弱的,我们应该在将它们保存到数据库之前对它们进行加密。

由于密码本质上是弱的,我们应该在将它们保存到数据库之前对它们进行加密。 为此,我们使用 bcrypt-nodejs 来帮助我们加密和解密密码。

如果你对代码片段感到不安并希望看到完整的代码,请随时在此处浏览代码。

注册策略

现在,我们定义下一个策略,该策略将处理新用户的注册并在我们的基础 Mongo DB 中创建他或她的条目:

在这里,我们再次使用 Mongoose API 来查找是否已存在具有给定用户名的任何用户。 如果没有,则创建一个新用户并将用户信息保存在 Mongo 中。 否则使用完成回调和 flash 消息返回错误。 请注意,我们使用 bcrypt-nodejs 在保存之前创建密码的哈希:

创建路由

如果我们看到我们的应用程序的鸟瞰图,它看起来像:

Birds Eye View of Our ApplicationBirds Eye View of Our ApplicationBirds Eye View of Our Application

我们现在在以下模块中定义应用程序的路由,该模块采用在上面的 app.js 中创建的 Passport 实例。 将此模块保存在 routes / index.js 中

上面代码片段中最重要的部分是使用 passport.authenticate() 在分别对 / login 和 / signup 路由进行 HTTP POST 时,将身份验证委派给登录和注册策略。 请注意,不必在路径路径上命名策略,并且可以将其命名为任何名称。

创建主视图

接下来,我们为应用程序创建以下两个视图:

  1. layout.jade 包含基本布局和样式信息
  2. index.jade 包含登录页面,其中包含登录表单并提供创建新帐户的选项

感谢 Bootstrap,我们的登录页面现在看起来像

Login Page for Our Passport AppLogin Page for Our Passport AppLogin Page for Our Passport App

我们还需要两个注册详细信息和应用程序主页的视图:

  1. register.jade 包含注册表单
  2. home.jade 说你好,并显示登录用户的详细信息

如果你不熟悉 Jade,请查看文档。

实现注销功能

作为插件的 Passport 被允许在请求和响应对象上添加某些属性和方法,并通过添加非常方便的 request.logout()来正确使用它。 使用户会话与其他属性无效的方法。

保护路线

Passport 还能够保护对被认为不适合匿名用户的路由的访问。 这意味着如果某个用户尝试访问 http:// localhost:3000 / home 而未在应用程序中进行身份验证,则他将通过执行重定向到主页

结论

Passport 并不是这个领域中唯一一个认证 Node.js 应用程序的插件,而且还有像 EveryAuth 这样的替代品,但模块化,灵活性,社区支持以及它只是一个插件使 Passport 绝对是一个更好的选择。

关于两者之间的详细比较,这是 Passport 自己的开发人员的一个有趣的看法。

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.