本文将向您介绍如何使用 Express.js 和 MongoDB 进行身份验证。我们将探讨如何使用 Express.js 中间件和 MongoDB 数据库来创建基本的身份验证系统。本文旨在为初学者提供一个入门指南,但同时也提供深入洞察的内容和建议。
简介
身份验证是感知和验证用户的一种方法,以确认他们是否拥有访问应用程序的权限。HTTP 基本身份验证不足以保护对敏感资源的访问。因此,更何况在大多数应用中,身份验证和授权都是不可或缺的组成部分。
MongoDB
MongoDB 是一种面向文档的数据存储解决方案,它使用平面文档 JSON 格式,而不是使用关系型表。这使得存储数据变得更加简单,因为我们不必考虑复杂的关系。这使得它成为身份验证的理想选择。
Express.js
Express.js 是一个开发 Web 应用程序的 Node.js 框架。它提供了一个简单易用的 API,用于编写 HTTP API、Web 应用程序和其他基于 HTTP 协议的网络服务。
步骤
在开始之前,请确保您已安装 Node.js 和 MongoDB。我们将按下面的步骤进行身份验证设置。
步骤 1:使用 Node.js 和 Express.js 初始化应用程序
我们要使用 Express.js 创建一个 Node.js 应用程序。首先,启动终端并运行以下命令:
mkdir node-auth cd node-auth npm init -y
这将初始化一个新的 Node.js 应用程序,并在 package.json 中创建一个基本的配置。
现在,我们要安装依赖项 Express.js、Body-parser、运行 npm install 命令:
npm install express body-parser
创建 app.js 文件并添加以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- --- - ---------- --------------------------- -- ---- ----- ------------ ----- ---- -- - --------------- --------- --- ---------------- -- -- - ------------------- -- -- --- ------- -- ---- ------- ---展开代码
上面的代码创建了一个 Express.js 应用程序,并将其联接到 3000 端口。它还定义了一个测试路线,可以快速检查应用程序是否正在运行。
使用以下命令在浏览器中打开 http://localhost:3000,以确保应用程序正在运行:
node app.js
如果一切正常,当您访问拥有/根目录时,您应该看到 "Hello World!" 。
步骤 2:建立 MongoDB 数据库
为了存储用户的身份验证数据,我们要在 MongoDB 中建立专用数据库。首先,启动 MongoDB 服务器,然后使用 shell 连接到 MongoDB。
第一次运行 MongoDB 服务器时,数据库可能不会连接并启动。如果这是您首次使用 MongoDB,请使用以下命令将数据目录设置为 ~/data/db :
sudo mkdir /data/db sudo chmod 777 /data/db
然后,启动 mongod 服务器:
mongod
另外,打开新终端,使用以下命令连接到 MongoDB:
mongo
现在,我们要创建一个名为 node-auth 的新数据库。在连接到 MongoDB 后,运行以下命令:
use node-auth
然后,创建一个名为 "users" 的集合,该集合将用于存储有关用户的信息:
db.createCollection('users')
步骤 3:添加身份验证路由
添加路由,该路由可用于进行新用户注册和现有者登录。我们将使用 POST 请求来执行这些操作,因为我们只想使用 POST 请求来发送敏感的信息(如密码等)。
-- -------------------- ---- ------- ----- ----- - --- -- ------ ----- ------------------- ----- ---- -- - ----- - ----- ------ -------- - - --------- ------------ --- ------------- ----- ------ --------- --- -------------- ------- --- ---- ------ ------ --- -- ----- ----- ------------------ ----- ---- -- - ----- - ------ -------- - - --------- ----- ---- - -------------- -- ------- --- ------- -- ------ -- ------------- --- --------- - ------ ----------------------------- ----- -- ------------ - -------------- ------------ --- ---- ------ ------ ---展开代码
上面的代码添加了 /signup 和 /login 路由,以便注册和登录新用户。当发送 POST 请求时,我们会将新数据添加到 users 数组中。给定电子邮件地址的用户将被识别并授权访问应用程序。
步骤 4:将身份验证信息存储在 MongoDB 中
现在,我们将使用 MongoDB 扩展上述代码来存储有关用户的信息。我们将使用 MongoDB 作为唯一的身份验证系统,而不是只使用内存中的数组。
首先,我们要获取 MongoDB 驱动程序:
npm install mongodb
添加以下代码来创建 MongoDB 数据库连接:
-- -------------------- ---- ------- ----- ----------- - ------------------------------- ----- --- - ---------------------------- ----- ------ - ------------ ------------------------ - ---------------- ---- -- ----- ------- -- - -- ----- - ----------------- - ----- -- - ------------------ --------------------- --------------- --------------- ---展开代码
这将创建连接到我们的 MongoDB 数据库的连接。
现在,我们要更新我们的 /signup 和 /login 路由,以使用 MongoDB 的 users 集合。
-- -------------------- ---- ------- -- ------ ----- ------------------- ----- ---- -- - ----- - ----- ------ -------- - - --------- ----- -- - ------------------ ----- ---------- - ----------------------- -------------------- ----- -- ----- ----- -- - -- ----- ----- ---- -- ------ - ------ -------------------------- ---- ---- ----- ------- --------- - ---------------------- ----- ------ -------- -- ----- ------- -- - -- ----- ----- ---- -------------- ------- --- ---- ------ ------ --- --- --- -- ----- ----- ------------------ ----- ---- -- - ----- - ------ -------- - - --------- ----- -- - ------------------ ----- ---------- - ----------------------- -------------------- ----- -- ----- ----- -- - -- ----- ----- ---- -- ------ -- ------------- --- --------- - ------ ----------------------------- ----- -- ------------ - -------------- ------------ --- ---- ------ ------ --- ---展开代码
如上所述,我们将使用 MongoDB 的 users 集合代替内存数组。我们还添加了一个新的查询 findOne 来查找具有给定电子邮件地址的用户。如果用户已保存在数据库中,则向客户端发送状态 409。对于新用户,我们将使用 insertOne 来将新数据插入到 users 集合中。
对于登录操作,我们使用 findOne 从数据库中查找给定电子邮件地址的用户。如果该用户不在数据库中或密码不匹配,则向客户端发送状态 401(无授权)。
步骤 5:使用 JSON Web Token 进行身份验证
现在,我们在 MongoDB 中存储用户数据,并已使用 /signup 和 /login 路由进行身份验证。最后一步是专业化身份验证方法,以在会话期间保持身份。我们引入 JSON Web Tokens 来完成此操作。
我们要使用 jsonwebtoken npm 包来添加 JWT 机制。运行以下命令以将其安装为依赖项:
npm install jsonwebtoken
让我们现在更新我们的 /login 路由,以生成 JWT 并将其回传。
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------ - ----------- -- ------------------- -- ----- ----- ------------------ ----- ---- -- - ----- - ------ -------- - - --------- ----- -- - ------------------ ----- ---------- - ----------------------- -------------------- ----- -- ----- ----- -- - -- ----- ----- ---- -- ------ -- ------------- --- --------- - ------ ----------------------------- ----- -- ------------ - ----- ----- - -------------- ------- - ---------- ---- --- ---------- ----- ------ --- --- ---展开代码
如上所述,我们在调用 jwt.sign 方法时将用户数据传递给其参数。第二个参数是用于生成签名的密钥,应从环境变量中提取。第三个参数是 token 的有效期。在上面的示例中,令牌将在 1 天后过期。
令牌已生成并作为响应的一部分发回客户端。客户端应存储令牌,并在随后的每个请求中将其添加到请求标头中。
步骤 6:验证 JWT
最后一步是验证 JWT。我们将编写一个中间件方法,用于检查请求的身份验证标头,并检查令牌的有效性。
-- -------------------- ---- ------- -- ------------ ---------- ----- ------------ - ----- ---- ----- -- - ----- ---------- - -------------------------- -- ------------- - ------ ------------------------ ------------- ------ --------- - ----- ----- - ------------------ ------ ----------------- ------- ----- -------- -- - -- ----- - ------ ----------------------------- --------- - -------- - -------- ------- --- -- -- ---- ----- ---------------- ------------- ----- ---- -- - ------------- ---- ----- ---------------- -- ----------------- ---展开代码
如上所述,我们先使用 authenticate 中间件来验证身份验证标头。中间件使用 req.headers.authorization 来获取身份验证标头,格式为 “Bearer [TOKEN]”。
如果找不到身份验证标头,则会向客户端发送 401 状态。如果找到,则会从标头中提取令牌(注意,这里我们使用 split 分割 bearer 和 token 字符串)。
最后,我们使用 jwt.verify 方法来验证令牌并将 decoded 对象附加到 req 上。decoded 对象包含有关用户的信息,如 ID、电子邮件地址和密码。
步骤 7:结束
现在让我们更新 app.js 以添加 auth 中间件路由
app.get('/auth', authenticate, (req, res) => { res.send(`The user named ${req.user.name} is authenticated!`); });
然后,运行您的程序进行身份验证。 通过 POST 请求进行身份验证并检查生成的JWT。将其用于下一步操作之一,并通过 /auth 路由验证 JWT 是否有效。
node app.js
实例代码
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- --- - ------------------------ ----- ----------- - ------------------------------- ----- --- - ---------- --------------------------- ----- --- - ---------------------------- ----- ------ - ------------ ----- ------ - ----------- --- ------- ------------------------ - ---------------- ---- -- ----- ---- -- - -- ----- - ----------------- - ------ - ---- ----- -- - ------------------ --------------------- --------------- --- -- ------ ----- ------------------- ----- ---- -- - ----- - ----- ------ -------- - - --------- ----- -- - ------------------ ----- ---------- - ----------------------- -------------------- ----- -- ----- ----- -- - -- ----- ----- ---- -- ------ - ------ -------------------------- ---- ---- ----- ------- --------- - ---------------------- ----- ------ -------- -- ----- ------- -- - -- ----- ----- ---- -------------- ------- --- ---- ------ ------ --- --- --- -- ----- ----- ------------------ ----- ---- -- - ----- - ------ -------- - - --------- ----- -- - ------------------ ----- ---------- - ----------------------- -------------------- ----- -- ----- ----- -- - -- ----- ----- ---- -- ------ -- ------------- --- --------- - ------ ----------------------------- ----- -- ------------ - ----- ----- - -------------- ------- - ---------- ---- --- ---------- ----- ------ --- --- --- -- ------------ ---------- ----- ------------ - ----- ---- ----- -- - ----- ---------- - -------------------------- -- ------------- - ------ ------------------------ ------------- ------ --------- - ----- ----- - ------------------ ------ ----------------- ------- ----- -------- -- - -- ----- - ------ ----------------------------- --------- - -------- - -------- ------- --- -- -- ---- ----- ----- -- --- ---------------- ------------- ----- ---- -- - ------------- ---- ----- ---------------- -- ----------------- --- ---------------- -- -- - ------------------- -- -- --- ------- -- ---- ------- ---展开代码
结论
在本文中,我们演示了如何使用 Express.js 和 MongoDB 创建基本的身份验证系统。我们使用 /signup 和 /login 路由来注册新用户和登录现有用户,并使用 MongoDB 的 users 集合进行持久化存储。最后,我们设置了 JSON Web Tokens,并使用 authenticate 中间件验证 JWT 的有效性。
除了上述方法之外,还有许多其他方法可供选择。例如,您可以使用 Passport.js 或使用 JSON Web Tokens 的其他实现。无论如何,从根本上了解身份验证是很重要的,因为身份验证是面向任何 Web 应用程序(尤其是对于那些处理敏感信息)的目标。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6771270e6d66e0f9aacc2b0a