Bỏ qua, đến nội dung

Câu hỏi thường gặp (FAQ) — Two-Factor Authentication

Thiết lập

User mất điện thoại, không thể đăng nhập?

Giải pháp theo thứ tự ưu tiên:

  1. Dùng verifier khác: Nếu user đã liên kết cả SMS và Email, có thể dùng phương thức còn lại
  2. Admin reset 2FA: Admin vào quản lý user, xóa liên kết verifier của user đó. User sẽ được yêu cầu liên kết lại khi đăng nhập
  3. Tắt tạm enforce: Nếu cần khẩn cấp, admin tắt enforce trong 2FA settings để user đăng nhập mà không cần 2FA

Có thể bật 2FA chỉ cho admin không?

Hiện tại plugin chỉ hỗ trợ enforce cho tất cả user hoặc không ai. Không có cấu hình theo role. Nếu cần phân biệt:

  • Bật enforce: false → để user tự chọn bật 2FA
  • Hoặc phát triển middleware tùy chỉnh kiểm tra role trước khi enforce

App authenticator (TOTP) nào được hỗ trợ?

Plugin hiện tại sử dụng hệ thống verification với loại sms-otpemail-otp. TOTP app (Google Authenticator) cần verification type riêng trong plugin-verification. Các app TOTP phổ biến:

  • Google Authenticator
  • Authy
  • Microsoft Authenticator
  • 1Password
  • Bitwarden

Plugin-verification có bắt buộc không?

Có, bắt buộc. Plugin 2FA import trực tiếp PluginVerificationServer và gọi:

  • verificationManager.addSceneRule() — đăng ký quy tắc scene
  • verificationManager.registerScene() — đăng ký scene '2fa'
  • verificationManager.getVerifiers() — lấy danh sách verifiers
  • verificationManager.getBoundRecord() — kiểm tra user đã liên kết chưa

Nếu plugin-verification chưa bật, plugin 2FA sẽ lỗi khi load.

Sử dụng

Mã 2FA nhập đúng nhưng vẫn báo sai?

Kiểm tra:

  1. Hết hạn: Mã OTP có thời gian hiệu lực — nhập ngay khi nhận
  2. Đã dùng: Mỗi mã chỉ dùng được 1 lần — yêu cầu gửi mã mới
  3. Sai verifier: Đảm bảo nhập mã cho đúng verifier đã chọn (SMS vs Email)
  4. Token hết hạn: 2FA token tạm thời có thể hết hạn — quay lại bước đăng nhập

Làm sao tắt 2FA?

Hai trường hợp:

  • User tự tắt: Nếu enforce: false, user có thể xóa liên kết verifier trong profile
  • Admin tắt: Tắt enforce trong 2FA settings hoặc xóa tất cả verifiers khỏi danh sách

Đã liên kết verifier rồi nhưng muốn đổi số điện thoại?

  1. Xóa liên kết verifier hiện tại
  2. Liên kết lại với số điện thoại mới
  3. Hệ thống sẽ gửi mã xác minh đến số mới để xác nhận

Cảnh báo

Nếu enforce: true và user xóa verifier duy nhất, user sẽ bị yêu cầu liên kết lại ở lần đăng nhập tiếp theo.

Bảo mật

2FA có bảo vệ chống phishing không?

Mã OTP giảm rủi ro nhưng không chống phishing 100%. Kẻ tấn công có thể:

  • Tạo trang giả → user nhập mã → kẻ tấn công dùng mã ngay lập tức (real-time phishing)
  • Giải pháp tốt hơn: kết hợp 2FA với FIDO2/WebAuthn (chưa hỗ trợ)

Dữ liệu 2FA lưu ở đâu?

Dữ liệuNơi lưuBảo mật
Cấu hình 2FAtwoFactorAuthSettingsChỉ admin truy cập được
Liên kết verifierQuản lý bởi plugin-verificationHashed/encrypted
2FA token tạmJWT tokenCó thời hạn, chứa user ID

Session check trả về thông tin gì?

Action twoFactorAuth:sessionCheck trả về:

json
{
  "enforce": true,
  "verifiers": [
    {
      "name": "sms-verifier",
      "title": "SMS Verification",
      "verificationType": "sms-otp",
      "verificationTypeTitle": "SMS OTP",
      "boundInfo": { "phone": "****1234" }
    }
  ]
}
  • enforce: Có bắt buộc 2FA không
  • verifiers: Danh sách verifier khả dụng với thông tin liên kết (đã mask)

Xử lý sự cố

Lỗi "You have already bound this verifier"?

User đã liên kết verifier này trước đó. Action bind kiểm tra getBoundRecord() trước khi cho phép liên kết. Nếu muốn đổi, cần xóa liên kết cũ trước.

Lỗi 401 khi gọi sessionCheck?

2FA token tạm thời không hợp lệ hoặc đã hết hạn. Nguyên nhân:

  • Token đã quá thời gian cho phép
  • Token bị thiếu hoặc sai format
  • Giải pháp: quay lại bước đăng nhập (nhập email + password) để lấy token mới

Plugin không load được?

Kiểm tra:

  1. plugin-verification đã bật chưa?
  2. Database migration đã chạy chưa? (yarn digiforce-nc upgrade)
  3. Collection twoFactorAuthSettings tồn tại trong database?