+2

Xây dựng hệ thống xác thực JWT trong ứng dụng Node.js chỉ với 8 bước đơn giản

Xác thực JWT (JSON Web Token) là phương pháp phổ biến để bảo mật ứng dụng web. Nó cho phép giao tiếp an toàn và xác minh danh tính, lý tưởng cho API. Bài viết này sẽ hướng dẫn bạn thực hiện xác thực JWT trong ứng dụng Node.js sử dụng MongoDB để lưu trữ dữ liệu.

Xác thực JWT là gì?

Xác thực JWT sử dụng JSON Web Token để xác minh danh tính người dùng trong ứng dụng web. Một JWT bao gồm ba phần: Header, Payload và Signature.

Phần Header chứa loại token và phương thức mã hóa. Phần Payload lưu trữ thông tin người dùng, chẳng hạn như tên người dùng và vai trò. Phần Signature xác minh tính hợp lệ của token, đảm bảo tính toàn vẹn dữ liệu. Token được người dùng trình bày để truy cập tài nguyên, hoạt động như bằng chứng về danh tính của họ.

Thiết lập dự án và kết nối Cơ sở dữ liệu

Bước 1: Thiết lập dự án

Để bắt đầu, hãy tạo một thư mục mới và khởi tạo dự án:

mkdir nodejs-jwt-auth
cd nodejs-jwt-auth
npm init -y

Cài đặt các dependency cần thiết:

npm install express mongoose jsonwebtoken dotenv

Trong đó:

  • express : Nền tảng để xây dựng máy chủ web.
  • mongoose : Thư viện MongoDB để xử lý mô hình dữ liệu.
  • jsonwebtoken : Thư viện để tạo và xác minh JWT.
  • dotenv : Quản lý các biến môi trường một cách an toàn.

Bước 2: Kết nối với MongoDB

Sử dụng MongoDB Atlas để lưu trữ đám mây. Đăng nhập vào MongoDB Atlas và lấy chuỗi kết nối của bạn.

Trong file .env, hãy thêm vào như sau:

MONGODB_URL='mongodb+srv://your-username:your-password@cluster.mongodb.net/your-database'
SECRET_KEY='your_secret_key'

Hãy thay thế các placeholder bằng thông tin đăng nhập của bạn.

Bước 3: Cấu hình môi trường với tệp .env

Tạo một file .env để lưu trữ URL MongoDB và khóa bí mật cho JWT.

MONGODB_URL='your-mongodb-connection-string'
SECRET_KEY='your-secret-key'

Bước 4: Thiết lập ứng dụng Express

Tạo file index.js để cấu hình kết nối Express và MongoDB:

const express = require("express");
const mongoose = require("mongoose");
require("dotenv").config();

const app = express();
const port = 3000;

app.use(express.json());

mongoose.connect(process.env.MONGODB_URL, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
}).then(() => console.log("MongoDB connected"))
  .catch(error => console.error("Connection error", error));

app.listen(port, () => console.log(`Server running on port ${port}`));

Chạy ứng dụng:

node index.js

Để khởi động lại tự động, hãy cài đặt nodemon :

npm install -g nodemon
nodemon index.js

Bước 5: Tạo mô hình người dùng

Xác định schema User trong models/User.js:

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
});

module.exports = mongoose.model("User", userSchema);

Bước 6: Xây dựng các tuyến xác thực

Trong routes/auth.js, xác định các routes đăng ký và đăng nhập để tạo người dùng và tạo token JWT.

const express = require("express");
const jwt = require("jsonwebtoken");
const User = require("../models/User");

const router = express.Router();

router.post("/signup", async (req, res) => {
  try {
    const { username, password } = req.body;
    const user = new User({ username, password });
    await user.save();
    res.status(201).json({ message: "User registered successfully" });
  } catch (error) {
    res.status(500).json({ message: "Internal Server Error" });
  }
});

router.post("/login", async (req, res) => {
  const { username, password } = req.body;
  try {
    const user = await User.findOne({ username });
    if (!user || user.password !== password) {
      return res.status(401).json({ message: "Invalid credentials" });
    }

    const token = jwt.sign({ id: user._id, username: user.username }, process.env.SECRET_KEY);
    res.json({ token });
  } catch (error) {
    res.status(500).json({ message: "Internal Server Error" });
  }
});

module.exports = router;

Bước 7: Bảo mật route bằng phần mềm trung gian

Tạo file middleware.js để xác minh JWT:

const jwt = require("jsonwebtoken");

function verifyJWT(req, res, next) {
  const token = req.headers["authorization"];
  if (!token) {
    return res.status(401).json({ message: "Access denied" });
  }

  jwt.verify(token, process.env.SECRET_KEY, (err, user) => {
    if (err) {
      return res.status(403).json({ message: "Invalid token" });
    }
    req.user = user;
    next();
  });
}

module.exports = verifyJWT;

Bước 8: Kiểm tra API

Đăng ký bằng cách POST tới /auth/signup với body JSON:

{ "username": "john_doe", "password": "securepass" }

Đăng nhập bằng cách POST tới /auth/login với cùng thông tin đăng nhập:

{ "username": "john_doe", "password": "securepass" }

Cuối cùng, truy cập Route được bảo vệ bằng cách gửi yêu cầu GET tới /protected với token JWT trong header Authorization:

Như vậy bạn đã triển khai thành công xác thực JWT trong ứng dụng Node.js. Thiết lập này bảo mật các tuyến API của bạn, chỉ cho phép người dùng đã xác thực truy cập chúng.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí