Xác thực JSON Web Token (JWT) trong Node.js
Bài viết này sẽ hướng dẫn cách sử dụng JSON Web Token (JWT) để xác thực người dùng trong ứng dụng Node.js. JWT là một cách phổ biến và an toàn để bảo mật API thông qua việc truyền thông tin xác thực giữa máy chủ và người dùng.
Trong bài viết này, chúng ta sẽ tìm hiểu cách tích hợp JSON Web Token (JWT) vào ứng dụng Node.js để thực hiện xác thực người dùng. Chúng ta sẽ sử dụng thư viện jsonwebtoken
để tạo, ký, và xác thực các JWT. Đây là một kỹ thuật bảo mật hữu ích để bảo vệ các API trong các ứng dụng web.
Mã Node.js:
// Cài đặt các thư viện cần thiết
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
// Khóa bí mật để ký JWT (không nên lộ ra ngoài)
const secretKey = 'your_secret_key';
// Route để đăng nhập và tạo JWT
app.post('/login', (req, res) => {
const { username, password } = req.body;
// Kiểm tra thông tin đăng nhập (giả sử đúng)
if (username === 'user' && password === 'password') {
// Tạo một JWT
const token = jwt.sign({ username }, secretKey, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Thông tin đăng nhập không đúng!');
}
});
// Middleware xác thực JWT
function authenticateToken(req, res, next) {
const token = req.headers['authorization'];
if (!token) return res.status(403).send('Không tìm thấy token.');
jwt.verify(token, secretKey, (err, user) => {
if (err) return res.status(403).send('Token không hợp lệ.');
req.user = user;
next();
});
}
// Route được bảo vệ chỉ cho phép truy cập khi có JWT hợp lệ
app.get('/protected', authenticateToken, (req, res) => {
res.send(`Hello, ${req.user.username}. Bạn đã truy cập thành công vào route được bảo vệ.`);
});
// Chạy máy chủ
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Giải thích chi tiết từng dòng code:
const express = require('express');
: Import thư việnexpress
để tạo ứng dụng web.const jwt = require('jsonwebtoken');
: Import thư việnjsonwebtoken
để làm việc với JWT.const secretKey = 'your_secret_key';
: Khóa bí mật để ký JWT (bạn nên thay thế bằng giá trị an toàn).app.post('/login', ...)
: Định nghĩa route/login
để xử lý đăng nhập và trả về JWT khi thông tin đăng nhập đúng.jwt.sign(...)
: Tạo JWT mới với payload chứa thông tin người dùng.authenticateToken(...)
: Middleware kiểm tra và xác thực JWT.jwt.verify(...)
: Xác minh JWT và kiểm tra tính hợp lệ.app.get('/protected', ...)
: Route được bảo vệ, chỉ có thể truy cập khi có JWT hợp lệ.
Yêu cầu hệ thống:
- Node.js phiên bản 12.x hoặc mới hơn.
- Các thư viện:
express
vàjsonwebtoken
.
Cách cài đặt các thư viện để chạy được đoạn mã trên:
npm install express jsonwebtoken
Lời khuyên:
- JWT nên được lưu trữ trong HTTP Only Cookies hoặc Local Storage, và đảm bảo mã hóa.
- Luôn sử dụng HTTPS để truyền JWT nhằm bảo vệ khỏi các tấn công man-in-the-middle.