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:
- Mở terminal và nhập các lệnh sau:
mkdir nodejs-jwt-auth cd nodejs-jwt-auth npm init -y
- Cài đặt các dependencies cần thiết:
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:
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:
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
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:
node index.js
Để khởi động lại tự động, 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
:
javascript
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
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
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ý người dùng bằng cách POST tới
/auth/signup
với JSON body:
{ "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. - 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 headerAuthorization
.
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