Cách mã hóa – \”Băm\” mật khẩu trong Nodejs bằng Bcrypt

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

Đây là bài viết dành cho các bạn đã có những khái niệm cơ bản về JavaScript, Nodejs và MongoDB:

Đảm bảo rằng bạn đã cài đặt phần mềm sau trên hệ thống của mình:

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 Ironhack Việt Nam – Hiện là full-stack Developer tại All Xone

Để lại một câu trả lời