Xác thực, bảo mật 2 lớp - 2FA - Two Factor Authentication
Xác thực 2 lớp (2FA) không còn là một tính năng "thêm thắt" mà đã trở thành tiêu chuẩn bảo mật bắt buộc cho mọi hệ thống hiện đại. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách tích hợp cơ chế TOTP (Time-based One-Time Password) – giải pháp sử dụng mã quét QR Code đồng bộ với các ứng dụng như Google Authenticator hoặc Authy.
1. Định nghĩa 2FA theo cách "bình dân học vụ"
Bảo vệ ứng dụng bằng hai loại ổ khóa.
Lớp khóa thứ nhất: đăng nhập bằng tài khoản và mật khẩu (cố định)
Lớp khóa thứ hai (Mã 2FA): một mã code được sinh ra ngẫu nhiên, thay đổi liên tục (không cố định)
Ngay cả khi kẻ trộm có chìa khóa thứ nhất (biết mật khẩu), chúng vẫn bất lực vì không có chiếc chìa khóa thứ hai đang thay đổi liên tục từng phút trên điện thoại của bạn.
2. Các hình thức 2FA phổ biến hiện nay
TOTP (Time-based One-Time Password): Hệ thống sinh ra một chuỗi mã 6 chữ số (qua các ứng dụng như Google Authenticator, Microsoft Authenticator, Authy) và mã này sẽ hết hạn sau mỗi 30 - 60 giây.
SMS OTP: Mã gửi về tin nhắn điện thoại.
Trước khi bắt tay vào code, bạn cần hiểu luồng đi của dữ liệu giữa Server, Client (Frontend) và Ứng dụng Xác thực (Authenticator App):
- Bật tính năng (Setup): Server tạo ra một chuỗi bí mật ngẫu nhiên (Secret Key) duy nhất cho mỗi user, sau đó mã hóa chuỗi này thành một QR Code và gửi về Frontend.
- Quét mã: User dùng ứng dụng (Google Authenticator) quét QR Code để lưu lại Secret Key.
- Sinh mã (OTP): Cứ mỗi 30 giây, ứng dụng trên điện thoại sẽ thuật toán hóa Secret Key kết hợp với thời gian hiện tại để sinh ra một mã gồm 6 chữ số.
- Xác thực: Khi đăng nhập, user nhập 6 chữ số này. Server cũng dùng chính Secret Key của user đó kết hợp với thời gian hiện tại để tính toán. Nếu mã Server tính ra khớp với mã User nhập => Hợp lệ.
3. Kiến Trúc API & Luồng Dữ Liệu
Quá trình triển khai sẽ chia làm 2 giai đoạn chính:
Giai đoạn 1: Setup 2FA (Kích hoạt lần đầu)
- API:
GET /api/v1/auth/get_2fa_qrcode - Frontend: Gọi API lấy chuỗi
base64của QR Code và hiển thị lên màn hình để user quét.
Giai đoạn 2: Verify 2FA (Xác nhận kích hoạt hoặc Đăng nhập)
- API:
POST /api/v1/auth/verify_2fa - Payload:
{ "code": "123456" }
3. Xem các flow tại: https://github.com/kentrung/son-linh-2fa
All rights reserved