Cách thêm xác thực hai yếu tố (2FA) vào ứng dụng
Để thêm xác thực hai yếu tố (2FA) vào ứng dụng, hãy cho phép người dùng liên kết một ứng dụng xác thực bằng cách quét mã QR, yêu cầu họ nhập mã sáu chữ số mà ứng dụng hiển thị sau mật khẩu, và chỉ tạo phiên đăng nhập đầy đủ trên server khi mã đó hợp lệ. Cấp cho mọi người dùng mã khôi phục dùng một lần khi họ bật tính năng này, giới hạn số lần ai đó có thể đoán mã, và yêu cầu mật khẩu cùng một mã hiện tại trước khi 2FA có thể bị tắt. Nếu bạn dùng nhà cung cấp xác thực được lưu trữ, hãy bật tùy chọn đa yếu tố tích hợp sẵn của họ thay vì tự xây dựng.
Hướng dẫn này đi qua các lựa chọn, luồng cụ thể, các prompt bạn có thể đưa cho công cụ xây dựng bằng AI, và những lỗi khiến 2FA trông có vẻ đang hoạt động nhưng thực ra không làm gì. Nếu khái niệm còn mới với bạn, hãy bắt đầu với xác thực hai yếu tố là gì.
Trước khi bắt đầu: bạn cần một hệ thống đăng nhập đang hoạt động
2FA nằm trên một cơ chế đăng nhập đã có sẵn. Bạn cần một trong hai thứ này trước:
- Hệ thống đăng nhập của riêng bạn, với người dùng và mật khẩu đã băm được lưu trong cơ sở dữ liệu của ứng dụng.
- Một nhà cung cấp xác thực được lưu trữ quản lý người dùng thay bạn.
Nếu bạn chưa có cái nào, hãy bắt đầu với cách thêm đăng nhập vào ứng dụng. Phần còn lại của hướng dẫn này giả định bước mật khẩu đã hoạt động.
Chọn yếu tố thứ hai của bạn
| Phương thức | Nỗ lực của người dùng | Mức bảo mật | Chi phí vận hành | Mặc định tốt? |
|---|---|---|---|---|
| Ứng dụng xác thực (TOTP) | Quét mã QR một lần, nhập mã khi đăng nhập | Tốt; có thể bị lừa đảo nếu một trang giả yêu cầu mã | Miễn phí | Có, với đa số ứng dụng |
| Passkey hoặc khóa bảo mật | Chạm hoặc dùng vân tay | Mạnh nhất; chống lừa đảo | Miễn phí | Có, nếu người dùng của bạn quen với nó |
| Mã qua email | Kiểm tra hộp thư khi đăng nhập | Chỉ mạnh bằng tài khoản email | Chi phí gửi email | Chỉ làm phương án dự phòng |
| Mã SMS | Chờ tin nhắn | Yếu nhất; bị đổi SIM và lừa đảo | Phí theo từng tin nhắn | Chỉ khi người dùng không dùng được ứng dụng |
TOTP là viết tắt của time-based one-time password (mật khẩu một lần theo thời gian), tiêu chuẩn (RFC 6238) mà các ứng dụng xác thực sử dụng. Máy chủ của bạn và điện thoại của người dùng chia sẻ một bí mật; mỗi bên tạo ra cùng một mã ngắn từ bí mật đó và thời điểm hiện tại, thường thay đổi sau mỗi 30 giây. Không cần kết nối mạng hay nhà cung cấp SMS.
Passkey thay thế hoặc bổ sung cho mật khẩu bằng một khóa mật mã được lưu trên thiết bị của người dùng. Chúng mạnh hơn nhưng khó xây dựng hơn khi tự làm, nên nhiều ứng dụng bắt đầu với TOTP và thêm passkey sau, hoặc lấy chúng từ nhà cung cấp xác thực.
Tự xây hay bật sẵn?
| Cách làm | Ưu điểm | Nhược điểm |
|---|---|---|
| MFA của nhà cung cấp xác thực được lưu trữ | Ít code hơn; nhà cung cấp duy trì các chi tiết bảo mật | Chi phí hằng tháng khi mở rộng; bạn phụ thuộc vào các tùy chọn của nhà cung cấp |
| TOTP riêng với thư viện | Kiểm soát đầy đủ; không phí theo người dùng | Bạn tự xử lý các trường hợp biên: khóa tài khoản, khôi phục, lưu trữ bí mật |
Hãy kiểm tra tài liệu hiện tại của nhà cung cấp để biết họ hỗ trợ những yếu tố nào và trên những gói nào. Dù chọn cách nào, đừng bao giờ tự viết phần toán sinh mã; hãy dùng một thư viện được sử dụng rộng rãi.
Quyết định chính sách trước
Hãy trả lời những câu hỏi này trước khi viết prompt, vì chúng thay đổi thiết kế:
- Ai phải dùng nó? Tùy chọn cho tất cả, bắt buộc với quản trị viên và nhân viên, hoặc bắt buộc với mọi người. Yêu cầu nó với bất kỳ ai có quyền quản trị là điều thường gặp. Xem kiểm soát truy cập theo vai trò.
- Người dùng bao lâu nhập lại mã một lần? Mỗi lần đăng nhập, hoặc một lần cho mỗi thiết bị trong 30 ngày ("ghi nhớ thiết bị này").
- Những hành động nào cần kiểm tra lại? Đổi email, thông tin nhận thanh toán, hoặc tắt 2FA là những ứng viên tốt. Đây được gọi là xác thực bước nâng cao (step-up authentication).
- Quy trình khi mất điện thoại là gì? Mã khôi phục, cùng một phương án dự phòng thủ công mà bạn sẵn sàng thực hiện.
Từng bước: 2FA bằng TOTP trên hệ thống đăng nhập của riêng bạn
1. Lưu đúng các trường
Mỗi người dùng cần: 2FA có được bật hay không, bí mật TOTP (được mã hóa khi lưu, không ở dạng văn bản thuần), thời điểm bật, và danh sách mã khôi phục được lưu ở dạng đã băm, giống như mật khẩu. Thêm một nơi để đếm số lần thử thất bại.
2. Đăng ký
- Người dùng mở Cài đặt và nhấn Bật xác thực hai yếu tố.
- Máy chủ tạo một bí mật mới và trả về dưới dạng mã QR, kèm bản văn bản cho những người không quét được.
- Người dùng quét mã trong một ứng dụng xác thực và nhập mã hiện tại.
- Máy chủ kiểm tra mã. Chỉ khi đúng, nó mới lưu bí mật và đánh dấu 2FA là đã bật.
- Ứng dụng hiển thị 8–10 mã khôi phục một lần và yêu cầu người dùng lưu lại.
Bước 4 rất quan trọng: bật 2FA trước khi xác nhận mã sẽ khóa bất kỳ ai quét mã thất bại.
3. Đăng nhập với bước thứ hai
- Người dùng gửi email và mật khẩu. Máy chủ kiểm tra chúng.
- Nếu 2FA được bật, máy chủ không tạo phiên đăng nhập đầy đủ. Thay vào đó, nó tạo một trạng thái "đang chờ yếu tố thứ hai" có thời hạn ngắn.
- Ứng dụng hiển thị màn hình nhập mã. Máy chủ kiểm tra mã, cho phép một khoảng dung sai nhỏ để bù lệch đồng hồ.
- Chỉ đến lúc này máy chủ mới cấp phiên đăng nhập thật.
Mọi route được bảo vệ và endpoint API đều phải từ chối trạng thái đang chờ. Màn hình 2FA chỉ ẩn trang trên trình duyệt có thể bị bỏ qua bằng cách gọi API trực tiếp.
4. Giới hạn và cảnh báo
Mã sáu chữ số có một triệu tổ hợp, có thể bị đoán nếu không có giới hạn. Hãy giới hạn số lần thử, khóa bước thứ hai trong một khoảng thời gian sau nhiều lần thất bại, và gửi email cho người dùng khi điều đó xảy ra. Xem giới hạn tần suất (rate limiting) và gửi email từ ứng dụng.
5. Khôi phục và tắt
- Mã khôi phục chỉ dùng được một lần, sau đó bị xóa.
- Tắt 2FA cần mật khẩu và một mã hiện tại hoặc mã khôi phục.
- Tạo lại mã khôi phục sẽ vô hiệu hóa bộ mã cũ.
- Gửi email cho người dùng mỗi khi 2FA được bật hoặc tắt.
Prompt để đưa cho công cụ xây dựng bằng AI
Bắt đầu với luồng cốt lõi:
Thêm xác thực hai yếu tố tùy chọn bằng ứng dụng xác thực (TOTP) vào hệ thống đăng nhập bằng email và mật khẩu hiện có. Dùng một thư viện TOTP phổ biến, không tự viết thuật toán. Trong Cài đặt, hiển thị mã QR và bí mật dạng văn bản, và chỉ bật 2FA sau khi người dùng nhập đúng mã. Lưu bí mật đã mã hóa và không bao giờ hiển thị lại sau khi thiết lập. Hiển thị 10 mã khôi phục dùng một lần một lần duy nhất và lưu chúng đã băm.
Rồi đến phần thi hành, nơi code do AI tạo thường thiếu sót nhất:
Thi hành 2FA trên server. Sau khi nhập đúng mật khẩu, người dùng bật 2FA sẽ nhận một trạng thái chờ có thời hạn ngắn, không phải phiên đăng nhập đầy đủ. Mọi trang và route API được bảo vệ phải từ chối trạng thái chờ. Giới hạn số lần thử mã là 5, sau đó khóa bước thứ hai trong 15 phút và gửi email cho người dùng.
Rồi đến chính sách:
Bắt buộc 2FA cho tài khoản quản trị: quản trị viên chưa bật 2FA sẽ được chuyển đến màn hình thiết lập và không thể vào bảng điều khiển cho đến khi hoàn tất. Yêu cầu mật khẩu và một mã hiện tại để tắt 2FA hoặc đổi email tài khoản. Gửi email cho người dùng khi 2FA được bật hoặc tắt.
Cuối cùng, yêu cầu agent giải thích những gì nó đã xây dựng:
Liệt kê mọi route có kiểm tra yếu tố thứ hai đã hoàn tất, nơi lưu bí mật TOTP và mã khôi phục, và cách chúng được bảo vệ.
Những lỗi thường gặp
- Cấp phiên đăng nhập sau mật khẩu. Đây là lỗi nghiêm trọng nhất. Nếu phiên đầy đủ tồn tại trước khi mã được kiểm tra, 2FA chỉ là trang trí. Hãy kiểm thử bằng cách chỉ gọi một API được bảo vệ sau bước mật khẩu.
- Không giới hạn số lần thử. Số lần đoán không giới hạn khiến mã có thể bị dò bằng vũ lực.
- Bí mật hoặc mã khôi phục dạng văn bản thuần. Khi cơ sở dữ liệu bị rò rỉ, kẻ tấn công sẽ có yếu tố thứ hai của mọi người.
- Bật trước khi xác minh. Người dùng quét sai mã sẽ bị khóa ở lần đăng nhập tiếp theo.
- Không có đường khôi phục. Mỗi lần mất điện thoại đều trở thành một yêu cầu hỗ trợ hoặc một khách hàng bị mất.
- Tắt quá dễ dàng. Nếu một phiên bị đánh cắp có thể tắt 2FA mà không cần mã, lớp bảo vệ coi như vô nghĩa.
- Mã trong nhật ký. Đảm bảo mã và bí mật không bao giờ xuất hiện trong nhật ký máy chủ hoặc thông báo lỗi.
- Chỉ kiểm tra ở trang đăng nhập. Việc đặt lại mật khẩu, đăng nhập bằng liên kết ma thuật (magic link) và đăng nhập mạng xã hội cũng phải tôn trọng 2FA, nếu không chúng sẽ trở thành cách để vượt qua nó.
Danh sách kiểm thử
- Đăng ký chỉ hoàn tất sau khi nhập đúng mã
- Đăng nhập với mật khẩu đúng nhưng không có mã không cho quyền truy cập bất kỳ trang hoặc API được bảo vệ nào
- Mã sai bị từ chối; nhiều mã sai liên tiếp kích hoạt khóa và email
- Mã từ vài phút trước bị từ chối
- Mỗi mã khôi phục chỉ dùng được đúng một lần
- Tắt 2FA cần mật khẩu và một mã hiện tại
- Đặt lại mật khẩu không vượt qua được 2FA
- Quản trị viên chưa bật 2FA không vào được trang quản trị (nếu bắt buộc)
- Bí mật và mã khôi phục được mã hóa hoặc băm trong cơ sở dữ liệu
- Không có mã hay bí mật nào xuất hiện trong nhật ký
Hãy chạy toàn bộ danh sách kiểm tra bảo mật cho ứng dụng xây bằng AI trước khi ra mắt.
Thêm 2FA trong Mythex
Mythex không bao gồm hệ thống đăng nhập tích hợp sẵn cho người dùng cuối của ứng dụng bạn, nên 2FA là một phần của cách xác thực bạn chọn: hệ thống đăng nhập email và mật khẩu của riêng bạn dùng cơ sở dữ liệu của dự án, hoặc một nhà cung cấp được lưu trữ có hỗ trợ đa yếu tố. Bạn mô tả điều mình muốn trong chat bằng các prompt như trên, và mọi khóa của nhà cung cấp được đặt trong secrets của dự án (qua /secrets, cài đặt dự án hoặc thẻ secrets mà agent hiển thị) thay vì trong ô tin nhắn. Công thức trong tài liệu Thêm đăng nhập vào ứng dụng có một prompt khởi đầu, và Bảo mật cho ứng dụng bạn xây đề cập các thói quen liên quan đến khóa và quyền. Sau khi agent hoàn tất, hãy kiểm tra từng mục trong danh sách trong Preview trước khi publish.
Câu hỏi thường gặp
Cách dễ nhất để thêm xác thực hai yếu tố vào ứng dụng là gì?
Nếu bạn dùng nhà cung cấp xác thực được lưu trữ, hãy bật tùy chọn đa yếu tố tích hợp sẵn của họ; thường đây là cách ít code nhất. Nếu bạn tự vận hành hệ thống đăng nhập, hãy thêm mã từ ứng dụng xác thực (TOTP) bằng một thư viện phổ biến, cùng mã khôi phục và kiểm tra phía server.
Tôi có nên dùng mã SMS cho 2FA không?
SMS vẫn tốt hơn là không có yếu tố thứ hai, nhưng đây là lựa chọn phổ biến yếu nhất vì tin nhắn có thể bị chuyển hướng qua việc đổi SIM và mã có thể bị lừa đảo. Hãy đưa ứng dụng xác thực làm mặc định, và passkey nếu người dùng của bạn đã sẵn sàng.
Tôi có cần cơ sở dữ liệu để thêm 2FA không?
Nếu bạn tự vận hành hệ thống đăng nhập, thì có. Bí mật 2FA của mỗi người dùng, trạng thái bật hay tắt 2FA, và các mã khôi phục đã băm phải được lưu ở nơi máy chủ của bạn có thể kiểm tra. Nhà cung cấp xác thực được lưu trữ sẽ lưu những thứ này cho bạn.
Điều gì xảy ra nếu người dùng làm mất điện thoại?
Họ đăng nhập bằng một trong các mã khôi phục dùng một lần mà bạn đã hiển thị khi họ bật 2FA, rồi thiết lập lại 2FA trên thiết bị mới. Nếu không có mã khôi phục, bạn cần một bước xác minh danh tính thủ công, vì vậy hãy quyết định quy trình đó trước khi ra mắt.