使用 Express 和 Mongo 在 NodeJS 中进行身份验证 - CodeLab #1

2025-05-25

使用 Express 和 Mongo 在 NodeJS 中进行身份验证 - CodeLab #1

我正在启动一个 CodeLab 系列,在其中我将构建一些很酷的东西并与社区分享。

今天,我们将使用 JWT、express 和 MongoDB 在 Node 中实现身份验证 API。

我建议你按照目录操作,不要错过任何步骤。最后我会提供完整的应用程序代码链接。

目录


1. 简介

身份验证——这是识别用户身份的过程。

用户身份验证包含多个步骤,请查看此流程图了解更多信息。我们将使用此流程在我们的应用程序中构建身份验证系统。

替代文本


2. 先决条件

你应该预先了解javascript basicsnodejs。了解 ES6 语法者优先。最后,你的系统上应该安装Node.js。


3. 所需软件包

您将需要以下“npm”包。

  1. express
    Express 是一个最小且灵活的 Node.js Web 应用程序框架,为 Web 和移动应用程序提供了一组强大的功能

  2. express-validator
    要在 Express 框架中验证服务器上的主体数据,我们将使用此库。它是一个服务器端数据验证库。因此,即使恶意用户绕过了客户端验证,服务器端数据验证也会捕获该行为并抛出错误。

  3. body-parser
    它是nodejs解析主体数据的中间件。

  4. bcryptjs
    这个库将用于对密码进行哈希处理,然后将其存储到数据库中。这样,即使应用程序管理员也无法访问用户的帐户。

  5. jsonwebtoken
    jsonwebtoken将用于在注册时加密我们的数据负载并返回一个令牌。我们可以使用该令牌在仪表盘等安全页面进行身份验证。此外,还有一个选项可以设置这些令牌的有效期,以便您可以指定令牌的有效期。

  6. mongoose
    Mongoose 是一个 MongoDB 对象建模工具,旨在在异步环境中工作。Mongoose 同时支持 Promise 和回调。


4. 启动项目

我们将从创建一个 Node 项目开始。首先,创建一个名为“node-auth”的新文件夹,然后按照以下步骤操作。所有项目文件都应位于“node-auth”文件夹中。

npm init

Enter fullscreen mode Exit fullscreen mode

npm init会询问你一些关于项目的基本信息。现在,你已经创建了 Node 项目,是时候安装所需的软件包了。因此,请继续运行以下命令来安装软件包。

npm install express express-validator body-parser bcryptjs jsonwebtoken mongoose --save
Enter fullscreen mode Exit fullscreen mode

现在,创建一个文件index.js并添加此代码。

// File : index.js

const express = require("express");
const bodyParser = require("body-parser");

const app = express();

// PORT
const PORT = process.env.PORT || 4000;

app.get("/", (req, res) => {
  res.json({ message: "API Working" });
});


app.listen(PORT, (req, res) => {
  console.log(`Server Started at PORT ${PORT}`);
});

Enter fullscreen mode Exit fullscreen mode

如果您node index.js在终端中输入,服务器将从 PORT 4000 启动。

您已成功设置 NodeJS 应用。现在是时候设置数据库以添加更多功能了。


5.设置MongoDB数据库

我们将使用 MongoDB 数据库来存储用户数据。您可以使用云端 MongoDB 服务器或本地 MongoDB 服务器。

在此 CodeLab 中,我们将使用称为mLab 的Cloud MongoDB 服务器。

首先,请在 mLab 上注册。然后按照以下步骤操作。

  1. 注册成功后,点击主页上的“新建”按钮。

  2. 现在,选择任意云提供商,例如 AWS。在“计划类型”中选择免费的“沙盒”,然后点击右下角的“继续”按钮。

  3. 选择区域(任意)并单击继续。

  4. 输入数据库名称(任意)。我使用的是node-auth。点击“继续”,然后在下一页提交订单。不用担心,它是免费的。

  5. 现在,您将被重定向到主页。选择您的数据库,即 node-auth。

  6. 复制标准 MongoDB URI。

  7. 现在,您需要向数据库添加一个用户。在下面的 5 个选项卡中,点击“用户”,然后点击“添加数据库用户”来添加用户。

现在,您已经获得了数据库用户。将 && 替换为您的数据库用户名和密码。

mongodb://<dbuser>:<dbpassword>@ds257698.mlab.com:57698/node-auth

Enter fullscreen mode Exit fullscreen mode

所以,Mongo 服务器地址 (MongoURI) 应该是这样的。不要尝试连接我的 MongoURI。这只是一个虚拟的用户名和密码。😄😄

mongodb://test:hello1234@ds257698.mlab.com:57698/node-auth

Enter fullscreen mode Exit fullscreen mode

现在,您已经有了 mongoURI,可以将node-auth应用连接到数据库了。请按照以下步骤操作。


6.配置用户模型

我们先创建一个config文件夹,这个文件夹用来保存数据库连接信息。

config中创建一个名为: db.js的文件

//FILENAME : db.js

const mongoose = require("mongoose");

// Replace this with your MONGOURI.
const MONGOURI = "mongodb://testuser:testpassword@ds257698.mlab.com:57698/node-auth";

const InitiateMongoServer = async () => {
  try {
    await mongoose.connect(MONGOURI, {
      useNewUrlParser: true
    });
    console.log("Connected to DB !!");
  } catch (e) {
    console.log(e);
    throw e;
  }
};

module.exports = InitiateMongoServer;

Enter fullscreen mode Exit fullscreen mode

现在,我们已经完成了数据库连接。让我们创建用户模型来保存我们的注册用户。

继续创建一个名为model的新文件夹。在 model 文件夹中,创建一个新文件User.js。

我们将使用mongoose来创建 UserSchema。

用户.js


//FILENAME : User.js

const mongoose = require("mongoose");

const UserSchema = mongoose.Schema({
  username: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  createdAt: {
    type: Date,
    default: Date.now()
  }
});

// export model user with UserSchema
module.exports = mongoose.model("user", UserSchema);

Enter fullscreen mode Exit fullscreen mode

现在,我们已经完成了Database ConnectionUser Schema因此,让我们继续更新 index.js 以将我们的 API 连接到数据库。

index.js

const express = require("express");
const bodyParser = require("body-parser");
const InitiateMongoServer = require("./config/db");

// Initiate Mongo Server
InitiateMongoServer();

const app = express();

// PORT
const PORT = process.env.PORT || 4000;

// Middleware
app.use(bodyParser.json());

app.get("/", (req, res) => {
  res.json({ message: "API Working" });
});


app.listen(PORT, (req, res) => {
  console.log(`Server Started at PORT ${PORT}`);
});


Enter fullscreen mode Exit fullscreen mode

恭喜😄😄,您已成功将您的应用程序连接到 MongoDB 服务器。

现在,我们要做的是创建一个/user/signup注册新用户的路由。我们将在下一节中讨论这一点。


7. 用户注册

用户注册的路线将是“/user/signup”

创建一个名为 routes 的文件夹。在 routes 文件夹中,创建一个名为user.js

路线/用户.js


// Filename : user.js

const express = require("express");
const { check, validationResult} = require("express-validator/check");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const router = express.Router();

const User = require("../model/User");

/**
 * @method - POST
 * @param - /signup
 * @description - User SignUp
 */

router.post(
    "/signup",
    [
        check("username", "Please Enter a Valid Username")
        .not()
        .isEmpty(),
        check("email", "Please enter a valid email").isEmail(),
        check("password", "Please enter a valid password").isLength({
            min: 6
        })
    ],
    async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({
                errors: errors.array()
            });
        }

        const {
            username,
            email,
            password
        } = req.body;
        try {
            let user = await User.findOne({
                email
            });
            if (user) {
                return res.status(400).json({
                    msg: "User Already Exists"
                });
            }

            user = new User({
                username,
                email,
                password
            });

            const salt = await bcrypt.genSalt(10);
            user.password = await bcrypt.hash(password, salt);

            await user.save();

            const payload = {
                user: {
                    id: user.id
                }
            };

            jwt.sign(
                payload,
                "randomString", {
                    expiresIn: 10000
                },
                (err, token) => {
                    if (err) throw err;
                    res.status(200).json({
                        token
                    });
                }
            );
        } catch (err) {
            console.log(err.message);
            res.status(500).send("Error in Saving");
        }
    }
);

module.exports = router;

Enter fullscreen mode Exit fullscreen mode

现在,我们已经在routes/user.js中创建了用户注册。因此,我们需要在index.js中导入它以使其正常工作。

因此,更新后的索引文件代码应如下所示
。index.js


const express = require("express");
const bodyParser = require("body-parser");
const user = require("./routes/user"); //new addition
const InitiateMongoServer = require("./config/db");

// Initiate Mongo Server
InitiateMongoServer();

const app = express();

// PORT
const PORT = process.env.PORT || 4000;

// Middleware
app.use(bodyParser.json());

app.get("/", (req, res) => {
  res.json({ message: "API Working" });
});


/**
 * Router Middleware
 * Router - /user/*
 * Method - *
 */
app.use("/user", user);

app.listen(PORT, (req, res) => {
  console.log(`Server Started at PORT ${PORT}`);
});

Enter fullscreen mode Exit fullscreen mode

让我们开始使用 Postman 进行用户注册。Postman 是一个 API 测试工具。

替代文本


8.用户登录

现在,是时候实现将安装在“/user/login”上的登录路由器了。

这是登录功能的代码片段。在user.js中添加以下代码片段


router.post(
  "/login",
  [
    check("email", "Please enter a valid email").isEmail(),
    check("password", "Please enter a valid password").isLength({
      min: 6
    })
  ],
  async (req, res) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(400).json({
        errors: errors.array()
      });
    }

    const { email, password } = req.body;
    try {
      let user = await User.findOne({
        email
      });
      if (!user)
        return res.status(400).json({
          message: "User Not Exist"
        });

      const isMatch = await bcrypt.compare(password, user.password);
      if (!isMatch)
        return res.status(400).json({
          message: "Incorrect Password !"
        });

      const payload = {
        user: {
          id: user.id
        }
      };

      jwt.sign(
        payload,
        "randomString",
        {
          expiresIn: 3600
        },
        (err, token) => {
          if (err) throw err;
          res.status(200).json({
            token
          });
        }
      );
    } catch (e) {
      console.error(e);
      res.status(500).json({
        message: "Server Error"
      });
    }
  }
);

Enter fullscreen mode Exit fullscreen mode

替代文本

9. 获取登录用户

现在,您的用户注册用户登录已正常运行,并且您将获得一个令牌作为回报。

因此,我们的下一个任务是使用token检索已登录的用户。让我们开始添加这个功能。

/user/me如果您在标头中传递令牌,路由将返回您的用户。在文件 route.js 中添加以下代码片段。

/**
 * @method - GET
 * @description - Get LoggedIn User
 * @param - /user/me
 */


router.get("/me", auth, async (req, res) => {
  try {
    // request.user is getting fetched from Middleware after token authentication
    const user = await User.findById(req.user.id);
    res.json(user);
  } catch (e) {
    res.send({ message: "Error in Fetching user" });
  }
});
Enter fullscreen mode Exit fullscreen mode

如您所见,我们在/user/me GET 路由中添加了 auth 中间件作为参数,因此让我们定义auth函数。

继续创建一个名为middleware的新文件夹。在此文件夹中,创建一个名为auth.js的文件

该身份验证中间件将用于验证令牌,并根据令牌有效负载检索用户。

中间件/auth.js


const jwt = require("jsonwebtoken");

module.exports = function(req, res, next) {
  const token = req.header("token");
  if (!token) return res.status(401).json({ message: "Auth Error" });

  try {
    const decoded = jwt.verify(token, "randomString");
    req.user = decoded.user;
    next();
  } catch (e) {
    console.error(e);
    res.status(500).send({ message: "Invalid Token" });
  }
};
Enter fullscreen mode Exit fullscreen mode

太棒了!您已成功在 Node.js 中创建身份验证 API。现在,您可以登录后继续测试/user/me端点。

如何测试应用程序?

测试 API 需要 PostMan。如果您尚未安装 PostMan,请先安装。

  1. 首先,注册用户或登录(如果已经注册)。

  2. 从步骤 1 开始,您将获得一个令牌。复制该令牌并将其放入标头中。

  3. 点击提交

这是测试的预览。

替代文本

10. 结论

在本次CodeLab - 1中,我们学习了如何在 Node.js 中使用expressjsonwebtoken和 MongoDB 进行身份验证。我们还学习了如何编写中间件。

这是此 CodeLab 的完整代码链接:https://github.com/dipakkr/node-auth

此外,我很想知道您还想在下一个 CodeLabs 中涵盖哪些内容。


很高兴您看到这里,请给一些❤️❤️!!

如果您在运行/理解此应用程序时遇到问题,请在评论中告诉我。别忘了提供您的反馈。反馈有助于我不断改进。

订阅我的电子邮件通讯并获取最新信息!

我几乎每天都会写新内容。请在Twitter | Instagram上关注我

文章来源:https://dev.to/dipakkr/implementing-authentication-in-nodejs-with-express-and-jwt-codelab-1-j5i
PREV
像专业人士一样编写代码的 4 大开源 AI 🧠 🤖
NEXT
JavaScript 去抖动综合指南:提高代码效率