Tính năng xác thực qua điện thoại cho phép người dùng đăng nhập vào Firebase bằng điện thoại làm trình xác thực. Một tin nhắn SMS chứa mã duy nhất sẽ được gửi đến người dùng (bằng số điện thoại được cung cấp). Sau khi mã được uỷ quyền, người dùng có thể đăng nhập vào Firebase.
Google sẽ gửi và lưu trữ số điện thoại mà người dùng cuối cung cấp để xác thực nhằm cải thiện khả năng ngăn chặn thư rác và hành vi sai trái trên các dịch vụ của Google, bao gồm nhưng không giới hạn ở Firebase. Nhà phát triển phải đảm bảo rằng họ có được sự đồng ý thích hợp của người dùng cuối trước khi sử dụng dịch vụ đăng nhập bằng số điện thoại của Xác thực Firebase.
Tính năng Xác thực bằng điện thoại của Firebase không được hỗ trợ ở một số quốc gia. Vui lòng xem Câu hỏi thường gặp của họ để biết thêm thông tin.
Thiết lập
Trước khi bắt đầu sử dụng tính năng Xác thực bằng điện thoại, hãy đảm bảo bạn đã làm theo các bước sau:
- Bật tính năng Điện thoại làm phương thức đăng nhập trong bảng điều khiển của Firebase.
 - Android: Nếu bạn chưa đặt hàm băm SHA-1 của ứng dụng trong bảng điều khiển Firebase, hãy đặt hàm băm đó. Hãy xem phần Xác thực ứng dụng khách để biết thông tin về cách tìm hàm băm SHA-1 của ứng dụng.
 - iOS: Trong Xcode, hãy bật thông báo đẩy cho dự án của bạn và đảm bảo khoá xác thực APNs được định cấu hình bằng Giải pháp gửi thông báo qua đám mây của Firebase (FCM). Ngoài ra, bạn phải bật chế độ nền cho thông báo từ xa. Để xem nội dung giải thích chi tiết về bước này, hãy xem tài liệu Xác thực bằng điện thoại trên Firebase cho iOS.
 - Web: Đảm bảo rằng bạn đã thêm miền ứng dụng của mình trên bảng điều khiển của Firebase, trong mục Miền chuyển hướng OAuth.
 
Lưu ý: Bạn chỉ có thể dùng tính năng đăng nhập bằng số điện thoại trên các thiết bị thực và trên web. Để kiểm thử quy trình xác thực trên trình mô phỏng thiết bị, vui lòng xem phần Kiểm thử.
Cách sử dụng
SDK Xác thực Firebase cho Flutter cung cấp 2 cách riêng biệt để đăng nhập người dùng bằng số điện thoại. Các nền tảng gốc (ví dụ: Android và iOS) cung cấp chức năng khác nhau để xác thực số điện thoại so với web, do đó, mỗi nền tảng có 2 phương thức riêng biệt:
- Nền tảng gốc: 
verifyPhoneNumber. - Nền tảng web: 
signInWithPhoneNumber. 
Quảng cáo gốc: verifyPhoneNumber
Trên các nền tảng gốc, trước tiên, số điện thoại của người dùng phải được xác minh, sau đó người dùng có thể đăng nhập hoặc liên kết tài khoản của họ với một PhoneAuthCredential.
Trước tiên, bạn phải nhắc người dùng cung cấp số điện thoại của họ. Sau khi cung cấp, hãy gọi phương thức verifyPhoneNumber():
await FirebaseAuth.instance.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) {},
  verificationFailed: (FirebaseAuthException e) {},
  codeSent: (String verificationId, int? resendToken) {},
  codeAutoRetrievalTimeout: (String verificationId) {},
);
Bạn phải xử lý 4 lệnh gọi lại riêng biệt. Mỗi lệnh gọi lại sẽ xác định cách bạn cập nhật giao diện người dùng ứng dụng:
- verificationCompleted: Tự động xử lý mã SMS trên thiết bị Android.
 - verificationFailed: Xử lý các sự kiện thất bại, chẳng hạn như số điện thoại không hợp lệ hoặc liệu hạn mức SMS có bị vượt quá hay không.
 - codeSent: Xử lý khi mã đã được gửi đến thiết bị từ Firebase, dùng để nhắc người dùng nhập mã.
 - codeAutoRetrievalTimeout: Xử lý thời gian chờ khi tính năng xử lý mã qua SMS tự động không thành công.
 
verificationCompleted
Trình xử lý này sẽ chỉ được gọi trên các thiết bị Android hỗ trợ tính năng tự động phân giải mã SMS.
Khi mã SMS được gửi đến thiết bị, Android sẽ tự động xác minh mã SMS mà không yêu cầu người dùng nhập mã theo cách thủ công. Nếu sự kiện này xảy ra, một PhoneAuthCredential sẽ được cung cấp tự động. Bạn có thể dùng mã này để đăng nhập hoặc liên kết số điện thoại của người dùng.
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) async {
    // ANDROID ONLY!
    // Sign the user in (or link) with the auto-generated credential
    await auth.signInWithCredential(credential);
  },
);
verificationFailed
Nếu Firebase trả về lỗi, chẳng hạn như số điện thoại không chính xác hoặc nếu hạn mức SMS cho dự án đã vượt quá, thì FirebaseAuthException sẽ được gửi đến trình xử lý này. Trong trường hợp này, bạn sẽ nhắc người dùng rằng đã xảy ra lỗi, tuỳ thuộc vào mã lỗi.
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationFailed: (FirebaseAuthException e) {
    if (e.code == 'invalid-phone-number') {
      print('The provided phone number is not valid.');
    }
    // Handle other errors
  },
);
codeSent
Khi Firebase gửi mã SMS đến thiết bị, trình xử lý này sẽ được kích hoạt bằng verificationId và resendToken (resendToken chỉ được hỗ trợ trên thiết bị Android, thiết bị iOS sẽ luôn trả về giá trị null).
Sau khi kích hoạt, đây là thời điểm thích hợp để cập nhật giao diện người dùng ứng dụng nhằm nhắc người dùng nhập mã SMS mà họ đang chờ đợi.
Sau khi nhập mã nhận qua SMS, bạn có thể kết hợp mã xác minh với mã nhận qua SMS để tạo một PhoneAuthCredential mới:
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  codeSent: (String verificationId, int? resendToken) async {
    // Update the UI - wait for the user to enter the SMS code
    String smsCode = 'xxxx';
    // Create a PhoneAuthCredential with the code
    PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);
    // Sign the user in (or link) with the credential
    await auth.signInWithCredential(credential);
  },
);
Theo mặc định, Firebase sẽ không gửi lại tin nhắn SMS mới nếu tin nhắn đó đã được gửi gần đây. Tuy nhiên, bạn có thể ghi đè hành vi này bằng cách gọi lại phương thức verifyPhoneNumber với mã thông báo gửi lại đến đối số forceResendingToken.
Nếu thành công, hệ thống sẽ gửi lại tin nhắn SMS.
codeAutoRetrievalTimeout
Trên các thiết bị Android hỗ trợ tính năng tự động phân giải mã SMS, trình xử lý này sẽ được gọi nếu thiết bị chưa tự động phân giải một tin nhắn SMS trong một khoảng thời gian nhất định. Sau khi khoảng thời gian này kết thúc, thiết bị sẽ không còn cố gắng phân giải bất kỳ thông báo nào đến nữa.
Theo mặc định, thiết bị sẽ chờ 30 giây, tuy nhiên, bạn có thể tuỳ chỉnh thời gian này bằng đối số timeout:
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  timeout: const Duration(seconds: 60),
  codeAutoRetrievalTimeout: (String verificationId) {
    // Auto-resolution timed out...
  },
);
Web: signInWithPhoneNumber
Trên các nền tảng web, người dùng có thể đăng nhập bằng cách xác nhận rằng họ có quyền truy cập vào điện thoại bằng cách nhập mã SMS được gửi đến số điện thoại đã cung cấp. Để tăng cường bảo mật và ngăn chặn nội dung rác, người dùng được yêu cầu chứng minh rằng họ là người thật bằng cách hoàn tất một tiện ích Google reCAPTCHA. Sau khi bạn xác nhận, mã SMS sẽ được gửi đến.
Theo mặc định, SDK Xác thực Firebase cho Flutter sẽ quản lý tiện ích reCAPTCHA ngay khi bạn cài đặt, tuy nhiên, bạn có thể kiểm soát cách tiện ích này hiển thị và định cấu hình nếu cần.
Để bắt đầu, hãy gọi phương thức signInWithPhoneNumber bằng số điện thoại.
FirebaseAuth auth = FirebaseAuth.instance;
// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');
Việc gọi phương thức này trước tiên sẽ kích hoạt tiện ích reCAPTCHA để hiển thị. Người dùng phải hoàn tất bài kiểm tra trước khi mã SMS được gửi. Sau khi hoàn tất, bạn có thể đăng nhập cho người dùng bằng cách cung cấp mã SMS cho phương thức confirm trong phản hồi ConfirmationResult đã phân giải:
UserCredential userCredential = await confirmationResult.confirm('123456');
Giống như các quy trình đăng nhập khác, việc đăng nhập thành công sẽ kích hoạt mọi trình nghe trạng thái xác thực mà bạn đã đăng ký trong suốt ứng dụng của mình.
Cấu hình reCAPTCHA
Tiện ích reCAPTCHA là một quy trình được quản lý hoàn toàn, giúp bảo mật cho ứng dụng web của bạn.
Đối số thứ hai của signInWithPhoneNumber chấp nhận một thực thể RecaptchaVerifier không bắt buộc. Bạn có thể dùng thực thể này để quản lý tiện ích. Theo mặc định, tiện ích sẽ hiển thị dưới dạng một tiện ích không nhìn thấy được khi quy trình đăng nhập được kích hoạt.
Một tiện ích "vô hình" sẽ xuất hiện dưới dạng một phương thức toàn trang ở trên cùng của ứng dụng.
Tuy nhiên, bạn có thể hiển thị một tiện ích nội tuyến mà người dùng phải nhấn rõ ràng để xác minh danh tính.
Để thêm một tiện ích nội tuyến, hãy chỉ định một mã nhận dạng phần tử DOM cho đối số container của phiên bản RecaptchaVerifier.
Phần tử phải tồn tại và trống, nếu không sẽ xảy ra lỗi.
Nếu không có đối số container nào được cung cấp, tiện ích sẽ được hiển thị dưới dạng "vô hình".
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));
Bạn có thể thay đổi kích thước và giao diện (không bắt buộc) bằng cách tuỳ chỉnh các đối số size và theme như minh hoạ ở trên.
Bạn cũng có thể theo dõi các sự kiện, chẳng hạn như liệu người dùng đã hoàn tất reCAPTCHA hay chưa, liệu reCAPTCHA đã hết hạn hay đã xảy ra lỗi:
RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);
Thử nghiệm
Firebase hỗ trợ kiểm thử số điện thoại cục bộ:
- Trên Bảng điều khiển Firebase, hãy chọn trình xác thực "Điện thoại" rồi nhấp vào trình đơn thả xuống "Số điện thoại để kiểm thử".
 - Nhập số điện thoại mới (ví dụ: 
+44 7444 555666) và mã xét nghiệm (ví dụ:123456). 
Nếu bạn cung cấp số điện thoại kiểm thử cho phương thức verifyPhoneNumber hoặc signInWithPhoneNumber, thì sẽ không có tin nhắn SMS nào được gửi. Thay vào đó, bạn có thể cung cấp mã kiểm thử trực tiếp cho PhoneAuthProvider hoặc bằng trình xử lý kết quả xác nhận của signInWithPhoneNumber.