0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Hướng Dẫn Chi Tiết Xây Dựng Hệ Thống Xác Thực JWT Trong Node.js Chỉ Với 8 Bước Đơn Giản

Đăng vào 2 tháng trước

• 4 phút đọc

Chủ đề:

Node.js

Hướng Dẫn Chi Tiết Xây Dựng Hệ Thống Xác Thực JWT Trong Node.js Chỉ Với 8 Bước Đơn Giản

Giới thiệu

Xác thực JWT (JSON Web Token) là phương pháp phổ biến hiện nay để 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 người dùng, lý tưởng cho các API. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách thực hiện xác thực JWT trong một ứng dụng Node.js, đồng thời 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. Một JWT bao gồm ba phần chính: Header, Payload, và Signature.

  • Header: Chứa type token và phương thức mã hóa.
  • Payload: Lưu trữ thông tin người dùng như tên và vai trò.
  • Signature: Đảm bảo tính hợp lệ của token và tính toàn vẹn của dữ liệu.

Người dùng sẽ sử dụng token này để truy cập các tài nguyên, và token hoạt động như bằng chứng xác thực danh tính.

Bước 1: Thiết Lập Dự Án

Để bắt đầu, tạo một thư mục mới cho dự án:

  1. Mở terminal và nhập các lệnh sau:
    Copy
    mkdir nodejs-jwt-auth
    cd nodejs-jwt-auth
    npm init -y
  2. Cài đặt các dependencies cần thiết:
    Copy
    npm install express mongoose jsonwebtoken dotenv
    • express: Nền tảng để xây dựng máy chủ web.
    • mongoose: Thư viện cho 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, thêm thông tin sau:

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

Thay thế các placeholder bằng thông tin đăng nhập tương ứng 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:

Copy
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:

javascript Copy
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 với lệnh:

Copy
node index.js

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

Copy
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:

javascript Copy
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 cho đăng ký và đăng nhập:

javascript Copy
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 Gians

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

javascript Copy
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

  1. Đăng ký người dùng bằng cách POST tới /auth/signup với JSON body:
Copy
{ "username": "john_doe", "password": "securepass" }
  1. Đăng nhập bằng cách POST tới /auth/login với cùng thông tin đăng nhập.
  2. Truy cập vào Route được bảo vệ bằng cách gửi yêu cầu GET tới /protected cùng với token JWT trong header Authorization.

Kết Luận

Như vậy, bạn đã hoàn thành việc triển khai xác thực JWT trong ứng dụng Node.js của mình. Thiết lập này không chỉ bảo mật các tuyến API, mà còn đảm bảo rằng chỉ những người dùng đã xác thực mới có quyền truy cập vào tài nguyên của bạn.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào