Xây Dựng Hệ Thống Authentication Với JWT và Python Flask
Trong lập trình Back-end, bảo mật dữ liệu và xác thực người dùng là yếu tố không thể thiếu. Một trong những cách hiện đại và hiệu quả để làm điều này là sử dụng authentication với JWT (JSON Web Token). Kết hợp với lập trình Back-end Python và framework Flask, bạn có thể xây dựng một hệ thống xác thực mạnh mẽ, nhẹ nhàng và dễ mở rộng. Bài viết này sẽ hướng dẫn bạn từng bước để tạo API đăng nhập/đăng ký với JWT, kèm mẹo nâng cao để bảo vệ hệ thống khỏi các lỗ hổng phổ biến.
JWT Là Gì Và Tại Sao Dùng Cho Authentication?
Khái Niệm JWT
JWT là một chuỗi mã hóa (token) gồm 3 phần: Header, Payload, và Signature, được phân tách bởi dấu chấm (.) – ví dụ: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxfQ.signature. Nó được dùng để xác thực người dùng mà không cần lưu session trên server.
- Header: Chứa thuật toán mã hóa (thường là HMAC-SHA256).
- Payload: Chứa thông tin như user_id, exp (hết hạn).
- Signature: Đảm bảo token không bị giả mạo.
Lợi Ích Của Authentication Với JWT
- Stateless: Server không cần lưu token, giảm tải bộ nhớ.
- Dễ mở rộng: Hỗ trợ hệ thống phân tán, microservices.
- Tính linh hoạt: Dùng được trên web, mobile, API.
Theo OWASP (2024), JWT là tiêu chuẩn xác thực được 70% ứng dụng web hiện đại tin dùng – đủ để thấy sức mạnh của nó.
Tại Sao Chọn Flask Để Lập Trình Authentication?
Flask – một microframework Python – là lựa chọn tuyệt vời cho Back-end nhờ:
- Nhẹ và đơn giản: Dễ học, dễ tùy chỉnh, không phức tạp như Django.
- Hỗ trợ mạnh mẽ: Tích hợp dễ với các thư viện như PyJWT để xử lý token.
- Phù hợp API: Tập trung xây dựng RESTful API nhanh chóng.
Kết hợp Flask với JWT, bạn có thể tạo hệ thống xác thực an toàn chỉ trong vài giờ!
Hướng Dẫn Từng Bước: Xây Dựng Authentication Với JWT Trong Flask
Dưới đây là hướng dẫn chi tiết để xây dựng API đăng nhập/đăng ký với Flask và JWT. Bạn cần Python (tải từ python.org) và một editor như VS Code.
Bước 1: Cài Đặt Môi Trường
- Cài Python: Chạy python –version để kiểm tra.
- Tạo dự án: Tạo thư mục auth-api, vào thư mục và chạy:

- (flask-sqlalchemy để quản lý database – ví dụ dùng SQLite).
Bước 2: Thiết Lập Flask Và Database
Tạo file app.py:

Giải thích
- SECRET_KEY: Dùng để mã hóa JWT – nên dùng chuỗi ngẫu nhiên dài trong thực tế.
- User: Model lưu thông tin người dùng (username, password).
Bước 3: Tạo API Đăng Ký
Thêm endpoint /register:

Lưu ý: Trong thực tế, dùng bcrypt hoặc hashlib để hash password thay vì lưu plaintext như trên.
Bước 4: Tạo API Đăng Nhập Với JWT
Thêm endpoint /login:

Giải thích
- jwt.encode: Tạo token với user_id và thời hạn 1 giờ (exp).
- Token trả về dạng chuỗi, client sẽ gửi lại trong header để xác thực.
Bước 5: Bảo Vệ Route Với JWT
Tạo decorator kiểm tra token và endpoint /protected:

Giải thích:
- @token_required: Kiểm tra token trong header Authorization, decode để lấy user_id.
- Route /protected chỉ truy cập được khi có token hợp lệ.
Bước 6: Chạy và Kiểm Tra
Chạy app: python app.py (thêm app.run(debug=True) cuối file).
Test bằng Postman:
- POST /register: { “username”: “an”, “password”: “123” } → Nhận “Đăng ký thành công”.
- POST /login: { “username”: “an”, “password”: “123” } → Nhận token.
- GET /protected: Thêm header Authorization: Bearer → Nhận thông báo chào.
Ứng Dụng Thực Tế Của JWT Trong Back-end
- API bảo mật: Giới hạn truy cập vào endpoint nhạy cảm (như thông tin cá nhân).
- Single Sign-On (SSO): Dùng token chung cho nhiều dịch vụ.
- Mobile app: Lưu token trên client để duy trì phiên đăng nhập.
Mẹo Nâng Cao Để Bảo Mật Authentication Với JWT
- Hash Password: Dùng bcrypt: pip install bcrypt, rồi hash trước khi lưu: bcrypt.hashpw(password.encode(), bcrypt.gensalt()).
- Refresh Token: Tạo token thứ hai với thời hạn dài hơn (1 tháng) để cấp lại access token khi hết hạn.
- Token Blacklist: Lưu token hết hạn vào Redis để từ chối nếu bị lạm dụng.
- HTTPS: Triển khai qua HTTPS để mã hóa truyền tải token.
- Validate Payload: Kiểm tra thêm iat (issued at) để tránh token cũ bị tái sử dụng.
Ứng dụng thực tế:
- E-commerce: Cache danh sách sản phẩm, giảm tải khi sale lớn.
- API dữ liệu: Lưu kết quả thống kê phức tạp (như báo cáo doanh thu).
- Real-time: Kết hợp Redis pub/sub để thông báo cập nhật giá.
Lời Kết
Authentication với JWT là giải pháp xác thực hiện đại mà mọi lập trình viên Back-end nên nắm. Với Flask và lập trình Back-end Python, bạn có thể xây dựng hệ thống đăng nhập an toàn, stateless và dễ mở rộng chỉ trong vài bước. Hãy thử ngay API trên – thêm hash password hoặc refresh token để nâng cấp!
Liên hệ ngay CyberSoft để đọc thêm nhiều bài viết bổ ích khác trong tương lai.