Cách mã hóa – \”Băm\” mật khẩu trong Nodejs bằng Bcrypt
08/09/2024
Trong các bài toán đơn giản về tạo data cho chức năng đăng ký hoặc đăng nhập bằng Nodejs, password thường ở dạng String và có thể nhìn thấy trong database. Hôm nay, AllXOne sẽ giới thiệu cho các bạn một cách đơn giản để mã hóa password hay còn gọi là “Băm” password bằng cách sử dụng Bcrypt – một thuật toán mã hóa mật khẩu được thiết kế bởi Niels Provos and David Mazières.
Băm là một tấm vé một chiều để mã hóa dữ liệu. Hashing thực hiện chuyển đổi một chiều trên mật khẩu, biến mật khẩu thành một chuỗi khác, được gọi là mật khẩu băm.
Một số điều kiện để chúng ta có thể bắt đầu
Không dài dòng thêm nữa, chúng ta cùng bắt đầu
Bước 1 : Tạo một dự án Nodejs mới và tiến hành cài đặt init
npm init -y
Bước 2 : Cài đặt Express.js và Mongoose
npm install –save mongoose express
Bước 3 : Setup Express.js và kết nối nó với MongoDB bằng mongoose.
- Tạo một tệp mới có tên là index.js tại thư mục gốc của dự án và thêm đoạn code dưới đây vào:
const { request, response } = require(“express”);
const express = require(“express”);
const mongoose = require(“mongoose”);
const app = express();
const port = 8000;
const userRouter = require(“./app/routers/userRouter”)
const path = require(“path”);
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
mongoose.connect(“mongodb://localhost:27017/Test”, (error) => {
if (error) throw (error)
console.log(“Successfulity connect to MongoDB”)
})
app.listen(port, () => {
console.log(“App lisstening on port ” + port)
})
Như vậy, chúng ta đã tạo một dự án mới trong MongoDB tên là Test và một máy chủ trên cổng 8000.
Bước 4 Tiếp theo, tạo một thư mục app, trong đó chứa các components con là controller, model, router
Tại thư mục Model, tạo file userModel.js và thêm đoạn code sau:
const mongoose = require(“mongoose”);
const Schema = mongoose.Schema;
const userSchema = new Schema({
username: {
type: String,
required: true
},
email: {
type: String,
required: true,
unique: true,
match: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
},
password: {
type: String,
required: true,
},
createdAt: {
type: Date,
default: Date.now()
},
updatedAt: {
type: Date,
default: Date.now()
}
})
module.exports = mongoose.model(“User”, userSchema)
Cài đặt bcrypt
npm i –save bcrypt
Tại thư mục Controller, tạo file userController.js và thêm đoạn code sau:
const bcrypt = require(“bcrypt”);
const userModel= require(“../models/userModel”);
const mongoose = require(“mongoose”);
const { request } = require(“express”);
const { response } = require(“express”);
const validatePasword = (password) => {
return password.match(
// Tối thiểu tám ký tự, ít nhất một chữ cái, một số và một ký tự đặc biệt
/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/
);
};
const createUser = async (request, response) => {
let bodyRequest = request.body;
if(!bodyRequest.username) {
return response.status(400).json({
status: “Error 400: Bad Request”,
message: “username is required”
})
}
if(!bodyRequest.email) {
return response.status(400).json({
status: “Error 400: Bad Request”,
message: “email is required”
})
}
if(!bodyRequest.password) {
return response.status(400).json({
status: “Error 400: Bad Request”,
message: “password is required”
})
}
if (!validatePasword(bodyRequest.password)) {
return response.status(400).json({
status: “Error 400: Bad Request”,
message: “password is not valid”
})
}
let user = new userModel(bodyRequest);
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(user.password, salt);
user.save((error, doc) => {
if(error) {
response.status(500).json({
status: “Error 500: Email đã được đăng ký”,
message: error.message
})
} else {
response.status(201).send({
status: “Success 201: Đăng ký thành công”,
doc: doc
})
}
})
}
const logInUser = async (request, response) => {
let bodyRequest = request.body;
const user = await userModel.findOne({ email: bodyRequest.email });
if (user) {
const validPassword = await bcrypt.compare(bodyRequest.password, user.password);
if (validPassword) {
response.status(200).json({ status: “ok” });
} else {
response.status(400).json({ error: “Password không đúng!!!” });
}
} else {
response.status(401).json({ error: “Email không đúng!!!” });
}
}
module.exports = {
createUser,
logInUser
}
Tại thư mục router, tạo file userRouter.js và thêm đoạn code sau:
const express = require(“express”)
const { createUser, logInUser } = require(“../controller/userController”)
const router = express.Router();
router.post(“/register”, createUser);
router.post(“/login”, logInUser);
// exports router
module.exports = router;
Bước 5 : Chạy thử bằng Postman
Chạy dự án bằng lệnh node index.js.
Tạo người dùng mới với một email và mật khẩu bằng cách gửi yêu cầu Post tại
http://localhost:8000/register
. Lưu ý rằng bạn sẽ nhận được mật khẩu băm trong MogooDB.
Thự hiện đăng nhập bằng cách gửi yêu cầu Post tại
http://localhost:8000/login
Kết quả trong MogooDB sẽ như thế này:
Chúc các bạn thành công.
Cựu học viên Onshool Bootcamp – Hiện là full-stack Developer tại All Xone
Các chia sẻ của cựu học viên Onschool Bootcamp?
Danh mục bài viết
- Kiến thức lập trình
- Cộng đồng học viên
- Chia sẻ học viên