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:

  1. const express = require('express');: Import thư viện express để tạo ứng dụng web.
  2. const jwt = require('jsonwebtoken');: Import thư viện jsonwebtoken để làm việc với JWT.
  3. 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).
  4. 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.
  5. jwt.sign(...): Tạo JWT mới với payload chứa thông tin người dùng.
  6. authenticateToken(...): Middleware kiểm tra và xác thực JWT.
  7. jwt.verify(...): Xác minh JWT và kiểm tra tính hợp lệ.
  8. 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: expressjsonwebtoken.

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.


Các Hướng Dẫn Cùng Chủ Đề Đang Xem

Cách INSERT dữ liệu vào database MySQL bằng Node.js

Hướng dẫn cách sử dụng Prepared Statements trong Node.js để chèn dữ liệu vào bảng trong database MySQL một cách an toàn và hiệu quả, với nhiều tham số.
Cách DELETE dữ liệu từ database MySQL bằng Node.js

Hướng dẫn cách sử dụng Prepared Statements trong Node.js để xóa dữ liệu từ một bảng trong database MySQL một cách an toàn và hiệu quả.
Cách gửi dữ liệu tới API bằng Node.js

Bài viết này hướng dẫn cách gửi dữ liệu JSON tới một API bằng cách sử dụng thư viện axios trong Node.js, giúp bạn dễ dàng thực hiện các yêu cầu POST đến dịch vụ web.
Cách get data JSON từ API bằng Node.js

Bài viết này hướng dẫn cách lấy dữ liệu JSON từ API sử dụng module https trong Node.js, giúp bạn hiểu rõ hơn về cách tương tác với các dịch vụ web.
Cách UPDATE dữ liệu từ database MySQL bằng Node.js

Hướng dẫn cách sử dụng Prepared Statements trong Node.js để cập nhật dữ liệu trong một bảng của database MySQL một cách an toàn và hiệu quả.
Cách SELECT dữ liệu từ database MySQL bằng Node.js

Hướng dẫn cách sử dụng Prepared Statements trong Node.js để truy vấn dữ liệu từ database MySQL với nhiều tham số một cách an toàn và hiệu quả.
Các chức năng thường dùng khi sử dụng Selenium Chrome trong Node.js

Bài viết này sẽ liệt kê các chức năng thường dùng khi sử dụng Selenium với Chrome trong Node.js. Đây là các phương thức quan trọng giúp bạn tự động hóa quy trình kiểm thử và thao tác trên trình duyệt.
Tạo mã Captcha bằng Node.js

Hướng dẫn chi tiết cách tạo mã Captcha trong ứng dụng Node.js giúp bảo vệ trang web của bạn khỏi các bot tự động và cải thiện tính bảo mật.
Sử dụng Selenium trong Node.js để gửi đoạn mã JavaScript vào website trên Chrome

Hướng dẫn cách sử dụng Selenium trong Node.js để tự động hóa việc gửi đoạn mã JavaScript vào một trang web trên trình duyệt Chrome. Bài viết sẽ hướng dẫn từng bước từ cài đặt đến thực thi mã.
Hướng dẫn tạo form upload nhiều hình ảnh bằng Node.js

Hướng dẫn chi tiết cách tạo form upload nhiều hình ảnh trong Node.js bằng cách sử dụng thư viện `Multer` để xử lý tệp tải lên và `Express` để tạo server.

Đã thêm vào giỏ hàng