使用 Express 和 Mongo 在 NodeJS 中进行身份验证 - CodeLab #1
我正在启动一个 CodeLab 系列,在其中我将构建一些很酷的东西并与社区分享。
今天,我们将使用 JWT、express 和 MongoDB 在 Node 中实现身份验证 API。
我建议你按照目录操作,不要错过任何步骤。最后我会提供完整的应用程序代码链接。
目录
1. 简介
身份验证——这是识别用户身份的过程。
用户身份验证包含多个步骤,请查看此流程图了解更多信息。我们将使用此流程在我们的应用程序中构建身份验证系统。
2. 先决条件
你应该预先了解javascript basics
、nodejs
。了解 ES6 语法者优先。最后,你的系统上应该安装Node.js。
3. 所需软件包
您将需要以下“npm”包。
-
express
Express 是一个最小且灵活的 Node.js Web 应用程序框架,为 Web 和移动应用程序提供了一组强大的功能 -
express-validator
要在 Express 框架中验证服务器上的主体数据,我们将使用此库。它是一个服务器端数据验证库。因此,即使恶意用户绕过了客户端验证,服务器端数据验证也会捕获该行为并抛出错误。 -
body-parser
它是nodejs
解析主体数据的中间件。 -
bcryptjs
这个库将用于对密码进行哈希处理,然后将其存储到数据库中。这样,即使应用程序管理员也无法访问用户的帐户。 -
jsonwebtoken
jsonwebtoken将用于在注册时加密我们的数据负载并返回一个令牌。我们可以使用该令牌在仪表盘等安全页面进行身份验证。此外,还有一个选项可以设置这些令牌的有效期,以便您可以指定令牌的有效期。 -
mongoose
Mongoose 是一个 MongoDB 对象建模工具,旨在在异步环境中工作。Mongoose 同时支持 Promise 和回调。
4. 启动项目
我们将从创建一个 Node 项目开始。首先,创建一个名为“node-auth”的新文件夹,然后按照以下步骤操作。所有项目文件都应位于“node-auth”文件夹中。
npm init
npm init会询问你一些关于项目的基本信息。现在,你已经创建了 Node 项目,是时候安装所需的软件包了。因此,请继续运行以下命令来安装软件包。
npm install express express-validator body-parser bcryptjs jsonwebtoken mongoose --save
现在,创建一个文件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}`);
});
如果您node index.js
在终端中输入,服务器将从 PORT 4000 启动。
您已成功设置 NodeJS 应用。现在是时候设置数据库以添加更多功能了。
5.设置MongoDB数据库
我们将使用 MongoDB 数据库来存储用户数据。您可以使用云端 MongoDB 服务器或本地 MongoDB 服务器。
在此 CodeLab 中,我们将使用称为mLab 的Cloud MongoDB 服务器。
首先,请在 mLab 上注册。然后按照以下步骤操作。
-
注册成功后,点击主页上的“新建”按钮。
-
现在,选择任意云提供商,例如 AWS。在“计划类型”中选择免费的“沙盒”,然后点击右下角的“继续”按钮。
-
选择区域(任意)并单击继续。
-
输入数据库名称(任意)。我使用的是node-auth。点击“继续”,然后在下一页提交订单。不用担心,它是免费的。
-
现在,您将被重定向到主页。选择您的数据库,即 node-auth。
-
复制标准 MongoDB URI。
-
现在,您需要向数据库添加一个用户。在下面的 5 个选项卡中,点击“用户”,然后点击“添加数据库用户”来添加用户。
现在,您已经获得了数据库用户。将 && 替换为您的数据库用户名和密码。
mongodb://<dbuser>:<dbpassword>@ds257698.mlab.com:57698/node-auth
所以,Mongo 服务器地址 (MongoURI) 应该是这样的。不要尝试连接我的 MongoURI。这只是一个虚拟的用户名和密码。😄😄
mongodb://test:hello1234@ds257698.mlab.com:57698/node-auth
现在,您已经有了 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;
现在,我们已经完成了数据库连接。让我们创建用户模型来保存我们的注册用户。
继续创建一个名为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);
现在,我们已经完成了Database Connection
。User 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}`);
});
恭喜😄😄,您已成功将您的应用程序连接到 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;
现在,我们已经在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}`);
});
让我们开始使用 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"
});
}
}
);
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" });
}
});
如您所见,我们在/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" });
}
};
太棒了!您已成功在 Node.js 中创建身份验证 API。现在,您可以登录后继续测试/user/me端点。
如何测试应用程序?
测试 API 需要 PostMan。如果您尚未安装 PostMan,请先安装。
-
首先,注册用户或登录(如果已经注册)。
-
从步骤 1 开始,您将获得一个令牌。复制该令牌并将其放入标头中。
-
点击提交
这是测试的预览。
10. 结论
在本次CodeLab - 1中,我们学习了如何在 Node.js 中使用express、jsonwebtoken和 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