Skip to main content

Phương Án Triển Khai & Cấu Hình Dịch Vụ SMS OTP

Ngày cập nhật: 23/06/2026
File ảnh gốc: z7963975960598_7f184760b3154a03910533c69c46a978.jpg


Vấn Đề Hiện Tại

Màn hình "Đăng nhập bằng OTP" trên Mobile App đã được thiết kế xong giao diện nhập mã (6 ô OTP). Tuy nhiên, hệ thống SMS chưa được cấu hình, dẫn đến việc:

  • Khách hàng không nhận được tin nhắn SMS chứa mã OTP khi nhấn gửi.
  • Không thể hoàn tất quá trình đăng ký hoặc đăng nhập bằng số điện thoại.

Màn hình nhập OTP trên App

Để giải quyết vấn đề này, đội ngũ phát triển đề xuất 02 phương án triển khai SMS OTP chính dưới đây kèm theo hướng dẫn cấu hình chi tiết.


PHƯƠNG ÁN 1: Sử Dụng Firebase Phone Authentication (Khuyên dùng thử nghiệm & Tiết kiệm)

Phương án này sử dụng giải pháp xác thực số điện thoại miễn phí/giá rẻ của Firebase, tích hợp trực tiếp với SDK phía Client.

1. Đánh giá

  • Ưu điểm:
    • Tích hợp cực nhanh thông qua SDK Expo / React Native Firebase.
    • Không mất chi phí duy trì Brandname hàng tháng. Có hạn mức miễn phí ban đầu (tùy khu vực).
    • Firebase tự động quản lý vòng đời OTP (tạo mã, gửi đi, lưu trữ và xác thực mã).
  • Nhược điểm:
    • Định dạng tin nhắn gửi đi là mặc định của Google (chứa tên dự án Firebase), không hiển thị tên thương hiệu (Brandname) của doanh nghiệp làm tổng đài gửi.
    • Đôi khi bị nhà mạng chặn hoặc gửi trễ.
    • Trên iOS/Android bắt buộc phải cấu hình ReCAPTCHA (đôi khi kích hoạt Webview giả lập) nếu Play Integrity / APNs chưa cấu hình đúng.

2. Các bước cấu hình trên Firebase Console

  1. Truy cập vào Firebase Console -> Chọn Project của dự án.
  2. Menu trái chọn Build -> Authentication -> tab Sign-in method.
  3. Tại danh sách nhà cung cấp, chọn Phone -> Enable (Bật) và bấm Save.
  4. (Tùy chọn) Thêm số điện thoại thử nghiệm (Testing phone numbers) kèm mã OTP giả định để phục vụ quá trình test nội bộ hoặc gửi App Store/Google Play duyệt app mà không tốn chi phí gửi SMS thật.

3. Cấu hình phía Client App (Expo / React Native)

  • Cấu hình Android:
    • Lấy mã SHA-1SHA-256 từ máy phát triển (hoặc key của Google Play Console) và điền vào phần Project Settings -> ứng dụng Android trên Firebase.
    • Bật API Play Integrity (hoặc SafetyNet cũ) trên Google Cloud Console để tránh hiển thị hộp thoại reCAPTCHA xác minh robot khi đăng nhập trên thiết bị thật.
  • Cấu hình iOS:
    • Trên Apple Developer Portal: Tạo và tải xuống khóa APNs Key (.p8).
    • Trên Firebase Console: Upload file khóa .p8 này lên Project Settings -> Cloud Messaging -> Apple app share.
    • Bật quyền Background Modes (Remote notifications) và Push Notifications trong Xcode project.

PHƯƠNG ÁN 2: Tích Hợp API Cổng SMS Brandname Việt Nam (Chuyên nghiệp)

Phương án này sử dụng dịch vụ của bên thứ ba tại Việt Nam (như eSMS.vn, SpeedSMS.vn, hoặc Zalo ZNS). Backend sẽ chịu trách nhiệm sinh mã OTP, gọi API gửi tin nhắn và xác thực mã.

1. Đánh giá

  • Ưu điểm:
    • Tên người gửi hiển thị chuyên nghiệp (Ví dụ: GOLDENLOTUS thay vì đầu số lạ).
    • Tỷ lệ nhận tin nhắn (Deliverability) rất cao (> 98%) và tốc độ gửi siêu tốc (< 10 giây).
    • Nội dung tin nhắn tùy biến hoàn toàn theo mẫu tiếng Việt có dấu.
  • Nhược điểm:
    • Có phí đăng ký và duy trì Brandname hàng tháng với các nhà mạng (Vettel, Mobifone, Vinaphone...).
    • Chi phí mỗi tin nhắn OTP dao động từ 350đ – 800đ / SMS.
    • Thủ tục đăng ký Brandname với các nhà mạng cần giấy phép kinh doanh của doanh nghiệp và mất từ 7–15 ngày làm việc.

2. Luồng xử lý nghiệp vụ (Workflow)

sequenceDiagram
participant App as Mobile App
participant BE as Backend API
participant SMS as Cổng SMS Gateway (eSMS/SpeedSMS)
participant User as Điện thoại Khách hàng

App->>BE: 1. Yêu cầu gửi OTP (SĐT: 0906009757)
Note over BE: BE sinh mã ngẫu nhiên 6 số<br/>Lưu vào Redis kèm SĐT (Hạn: 5 phút)
BE->>SMS: 2. Gọi API gửi SMS (Brandname, SĐT, Nội dung OTP)
SMS-->>User: 3. Gửi SMS: "Ma OTP cua ban la 123456..."
User-->>App: 4. Khách hàng xem tin nhắn & nhập mã
App->>BE: 5. Gửi mã OTP để xác thực (SĐT + OTP)
Note over BE: BE so sánh mã nhập với mã trong Redis
BE-->>App: 6. Kết quả xác thực (Thành công -> Trả JWT Token)

3. Thông số cấu hình Backend cần thiết (Ví dụ cổng eSMS/SpeedSMS)

Admin cần cung cấp các thông số sau để tích hợp vào file môi trường (.env) của Backend:

# SMS Gateway Config (eSMS / SpeedSMS)
SMS_PROVIDER=esms # hoặc speedsms
SMS_API_KEY=YOUR_API_KEY_HERE
SMS_SECRET_KEY=YOUR_SECRET_KEY_HERE
SMS_BRANDNAME=GOLDENLOTUS
SMS_TEMPLATE_ID=YOUR_REGISTERED_TEMPLATE_ID

HƯỚNG DẪN CẤU HÌNH PHÒNG CHỐNG TẤN CÔNG SPAM SMS (Rate Limiting)

Để tránh việc hệ thống bị kẻ xấu lợi dụng spam gửi SMS liên tục gây tiêu tốn tài khoản tài chính, Backend bắt buộc phải cấu hình các ràng buộc bảo mật sau:

  1. Thời gian gửi lại tối thiểu (Resend Timeout):
    • Giới hạn thời gian bấm nút "Gửi lại OTP" tối thiểu là 60 giây (hiện tại giao diện App đang set đếm ngược, cần đồng bộ chặt chẽ với Backend).
  2. Hạn mức gửi theo IP/Thiết bị (IP Rate Limit):
    • Một địa chỉ IP chỉ được yêu cầu gửi tối đa 5 OTP / 1 giờ.
  3. Hạn mức gửi theo Số điện thoại (Phone Rate Limit):
    • Một số điện thoại chỉ được yêu cầu gửi tối đa 3 OTP / 15 phút và tối đa 10 OTP / 24 giờ.
  4. Giới hạn số lần nhập sai (Block Attempt):
    • Nếu nhập sai mã OTP quá 5 lần liên tiếp, khóa yêu cầu xác thực của số điện thoại đó trong vòng 30 phút.