• Home
  • Công nghệ
  • Xác Thực JWT Trong Node.js: Kết hợp với Redis Quản Lý Blacklist
Black List

Xác Thực JWT Trong Node.js: Kết hợp với Redis Quản Lý Blacklist

Trong bối cảnh bảo mật ứng dụng web ngày nay, việc xác thực người dùng và quản lý quyền truy cập là rất quan trọng. JSON Web Tokens (JWT) đã trở thành một phương pháp phổ biến để thực hiện xác thực. Tuy nhiên, khi sử dụng JWT, có một vấn đề phát sinh liên quan đến việc quản lý blacklist cho những token không còn hợp lệ. Trong bài viết này, chúng ta sẽ khám phá cách xác thực JWT trong Node.js và cách sử dụng Redis để quản lý blacklist một cách hiệu quả.

JSON Web Token (JWT) là một chuẩn mở (RFC 7519) cho phép truyền tải thông tin giữa hai bên dưới dạng một đối tượng JSON. Thông tin trong JWT được mã hóa và có thể được xác thực bằng cách sử dụng chữ ký số. JWT thường được sử dụng để xác thực người dùng và cung cấp quyền truy cập vào các tài nguyên.

Một JWT bao gồm ba phần:

  1. Header: Thông tin về loại token và thuật toán mã hóa.
  2. Payload: Chứa thông tin về người dùng và quyền hạn (claims).
  3. Signature: Được tạo bằng cách mã hóa header và payload cùng với một khóa bí mật.

Tại sao cần quản lý Blacklist?

Mặc dù JWT có ưu điểm là không cần lưu trữ trạng thái trên server (stateless), nhưng khi một token bị thu hồi (ví dụ: người dùng đăng xuất), cần có cơ chế để quản lý những token này. Nếu không, những token đã bị thu hồi vẫn có thể được sử dụng để truy cập vào tài nguyên.

Đây chính là lý do tại sao chúng ta cần sử dụng blacklist. Blacklist sẽ lưu trữ danh sách các JWT đã bị thu hồi để không cho phép chúng được sử dụng nữa.

Cách kết hợp JWT với Redis quản lý Blacklist trong Node.js

Bạn có thể làm theo các bước ở phía dưới hoặc xem video của anh Tips Javascript một người rất nổi tiếng trong việc tối ưu perfomance 

Bước 1: Cài đặt các gói cần thiết

Trước tiên, bạn cần cài đặt các gói npm cần thiết cho dự án Node.js của mình:

				
					npm install express jsonwebtoken redis dotenv

				
			

Bước 2: Thiết lập Redis

Khởi động một phiên bản Redis. Nếu bạn chưa có Redis, có thể tải và cài đặt Redis từ trang chủ của Redis.

Sau khi cài đặt xong, bạn có thể kiểm tra bằng cách chạy lệnh:

				
					redis-server
				
			

Bước 3: Tạo ứng dụng Node.js

Tạo một file app.js và cấu hình Express cùng với JWT và Redis.

				
					const express = require('express');
const jwt = require('jsonwebtoken');
const redis = require('redis');
const dotenv = require('dotenv');

dotenv.config();

const app = express();
const redisClient = redis.createClient();

redisClient.on('error', (err) => {
    console.error('Redis error: ', err);
});

app.use(express.json());

// Khóa bí mật cho JWT
const SECRET_KEY = process.env.SECRET_KEY || 'your_secret_key';

// <a href="https://fstack.io.vn/constructor-ham-tao-trong-java-la-gi-mot-so-cach-khai-bao-constructor-trong-java/">Hàm tạo</a> token
const generateToken = (userId) => {
    return jwt.sign({ id: userId }, SECRET_KEY, { expiresIn: '1h' });
};

// Middleware kiểm tra token
const authenticateJWT = (req, res, next) => {
    const token = req.header('Authorization')?.split(' ')[1];

    if (!token) return res.sendStatus(401);

    // Kiểm tra blacklist
    redisClient.get(token, (err, reply) => {
        if (reply) return res.sendStatus(401); // Token bị chặn

        jwt.verify(token, SECRET_KEY, (err, user) => {
            if (err) return res.sendStatus(403);
            req.user = user;
            next();
        });
    });
};

// Đăng nhập và tạo token
app.post('/login', (req, res) => {
    const { username } = req.body; // Giả sử bạn có một trường username
    const token = generateToken(username);
    res.json({ token });
});

// Đăng xuất (thu hồi token)
app.post('/logout', authenticateJWT, (req, res) => {
    const token = req.header('Authorization').split(' ')[1];

    // Lưu token vào Redis để blacklist
    redisClient.set(token, 'blacklisted', 'EX', 3600); // Thời gian sống 1 giờ
    res.sendStatus(200);
});

// Route bảo vệ
app.get('/protected', authenticateJWT, (req, res) => {
    res.send('This is a protected route.');
});

// Khởi động server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

				
			

Giải thích mã nguồn

  • Cài đặt Redis: Kết nối đến Redis và xử lý các lỗi kết nối.
  • Tạo token: Hàm generateToken tạo JWT cho người dùng với thời gian hết hạn là 1 giờ.
  • Middleware kiểm tra JWT: Middleware authenticateJWT sẽ kiểm tra xem token có tồn tại trong Redis không. Nếu có, nghĩa là token đã bị thu hồi và sẽ trả về lỗi 401. Nếu không, nó sẽ xác thực token và tiếp tục xử lý yêu cầu.
  • Đăng xuất: Khi người dùng đăng xuất, token sẽ được thêm vào Redis blacklist với thời gian sống (TTL) là 1 giờ.
  • Route bảo vệ: Route /protected sẽ chỉ cho phép truy cập nếu token là hợp lệ và không nằm trong blacklist.

Kết luận

Việc xác thực JWT trong Node.js kết hợp với Redis để quản lý blacklist mang lại một phương pháp bảo mật hiệu quả cho ứng dụng của bạn. Nó không chỉ giúp kiểm soát quyền truy cập mà còn bảo vệ tài nguyên của bạn khỏi các token không hợp lệ. Hãy áp dụng cách tiếp cận này để nâng cao mức độ bảo mật cho ứng dụng của bạn!

Bài viết liên quan

Công Nghệ Đám Mây: Giải Pháp Lưu Trữ Và Xử Lý Dữ Liệu Tối Ưu

Công Nghệ Đám Mây: Giải Pháp Lưu Trữ Và Xử Lý Dữ Liệu Tối Ưu Công nghệ đám…

ByByTrường SơnMar 19, 2025

Thực Tế Ảo (VR) và Thực Tế Tăng Cường (AR): Cánh Cửa Đến Thế Giới Mới

That’s a good title! It’s concise and accurately reflects the transformative potential of VR and AR. However, depending…

ByByTrường SơnMar 19, 2025

Lập Trình 4.0: Học Tập Và Thực Hành Để Thành Công

Lập Trình 4.0: Học Tập Và Thực Hành Để Thành Công Lập trình 4.0 không chỉ đơn thuần…

ByByTrường SơnMar 19, 2025

5 Công Nghệ Đột Phá Thay Đổi Cách Chúng Ta Sống

Năm công nghệ đột phá đang thay đổi cách chúng ta sống bao gồm: Trí tuệ nhân tạo…

ByByTrường SơnMar 19, 2025

Subscribe
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bình chọn nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận

0
Rất mong nhận được suy nghĩ của bạn, vui lòng bình luận.x
()
x
0869224813
Liên hệ