Lý thuyết và Thực hành tương tác trực tiếp
JWT dùng để chứng thực (Authentication) và phân quyền (Authorization). JWT gồm 3 phần: Header.Payload.Signature.
Phần Payload chỉ mã hóa Base64 nên ai cũng có thể đọc được. Do đó không bao giờ lưu mật khẩu ở đây. Phần Signature dùng để Server kiểm tra token có bị hacker sửa đổi hay không.
Khi username/password đúng, Server ký token với SECRET_KEY và trả về cho Client.
// Ký token (server.js)
const payload = { userId: 1, username: 'admin', role: 'admin' };
const token = jwt.sign(payload, 'SECRET_KEY', { expiresIn: '5m' });
res.json({ token });
Frontend nhận Token và dễ dàng xem nội dung Payload bằng JavaScript thuần túy.
// Decode Token (app.js)
const parts = token.split('.'); // Tách 3 phần
const payloadBase64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = JSON.parse(decodeURIComponent(atob(payloadBase64)));
console.log(jsonPayload);
Khi Client gọi API bảo vệ, Server bắt buộc phải xác thực (Verify) chữ ký và thời hạn. Sau đó đối chiếu Role thực tế dưới Database.
// Middleware Verify Token (server.js)
jwt.verify(token, 'SECRET_KEY', (err, decoded) => {
if (err) return res.status(403).json({ msg: 'Token lỗi hoặc hết hạn' });
// Check role từ DB để tránh trường hợp bị giáng quyền
const userInDB = db.find(u => u.id === decoded.userId);
if (userInDB.role !== 'admin') {
return res.status(403).json({ msg: 'Chỉ Admin mới được phép!' });
}
next(); // Cho phép đi tiếp
});
Chưa có dữ liệu
Bạn hãy thử sửa vài ký tự trong chuỗi Token ở dưới đây (giả làm Hacker):
Lấy dữ liệu bảo mật (Yêu cầu Token hợp lệ & Quyền Admin).