Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Xác thực điện thoại

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Xác thực qua điện thoại cho phép người dùng đăng nhập vào Firebase bằng cách sử dụng điện thoại của họ làm trình xác thực. Một tin nhắn SMS được gửi đến người dùng (sử dụng số điện thoại được cung cấp) có chứa một mã duy nhất. Sau khi mã đã được ủy quyền, người dùng có thể đăng nhập vào Firebase.

Số điện thoại mà người dùng cuối cung cấp để xác thực sẽ được Google gửi và lưu trữ để cải thiện việc ngăn chặn spam và lạm dụng trên dịch vụ của Google, bao gồm nhưng không giới hạn ở Firebase. Các 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 số điện thoại Xác thực Firebase.

Xác thực điện thoại Firebase không được hỗ trợ ở tất cả các 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.

Thành lập

Trước khi bắt đầu với Xác thực điện thoại, hãy đảm bảo bạn đã làm theo các bước sau:

  1. Bật Điện thoại làm phương thức Đăng nhập trong bảng điều khiển Firebase .
  2. Android : Nếu bạn chưa đặt hàm băm SHA-1 cho ứng dụng của mình trong bảng điều khiển Firebase , hãy làm như vậy. Xem Xác thực khách hàng của bạn để biết thông tin về cách tìm hàm băm SHA-1 cho ứng dụng của bạn.
  3. iOS : Trong Xcode, bật thông báo đẩy cho dự án của bạn và đảm bảo khóa xác thực APN của bạn được định cấu hình với Nhắn tin qua đám mây Firebase (FCM) . Để xem giải thích chuyên sâu về bước này, hãy xem tài liệu Xác thực điện thoại iOS của Firebase .
  4. 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 Firebase , trong miền chuyển hướng OAuth .

Ghi chú ; Đăng nhập bằng số điện thoại chỉ có sẵn để sử dụng trên các thiết bị thực và web. Để kiểm tra luồng xác thực của bạn trên trình giả lập thiết bị, vui lòng xem Kiểm tra .

Cách sử dụng

SDK xác thực Firebase cho Flutter cung cấp hai cách riêng lẻ để đăng nhập người dùng bằng số điện thoại của họ. Nền tảng gốc (ví dụ: Android & iOS) cung cấp các chức năng khác nhau để xác thực số điện thoại so với web, do đó có hai phương pháp dành riêng cho mỗi nền tảng:

  • Nền tảng gốc : verifyPhoneNumber .
  • Nền tảng web : signInWithPhoneNumber .

Native: verifyPhoneNumber

Trên nền tảng gốc, số điện thoại của người dùng trước tiên phải được xác minh và 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 PhoneAuthCredential .

Đầu tiên, bạn phải nhắc người dùng nhập số điện thoại của họ. Sau khi được 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) {},
);

Có 4 lệnh gọi lại riêng biệt mà bạn phải xử lý, mỗi lệnh sẽ xác định cách bạn cập nhật giao diện người dùng ứng dụng:

  1. Xác minh hoàn thành: Tự động xử lý mã SMS trên thiết bị Android.
  2. xác minh Không thành công: Xử lý các sự kiện không thành công, chẳng hạn như số điện thoại không hợp lệ hoặc liệu đã vượt quá hạn ngạch SMS hay chưa.
  3. codeSent : Xử lý khi mã đã được gửi đến thiết bị từ Firebase, được sử dụng để nhắc người dùng nhập mã.
  4. codeAutoRetrievalTimeout : Xử lý thời gian chờ khi xử lý mã SMS tự động không thành công.

xác minh

Trình xử lý này sẽ chỉ được gọi trên các thiết bị Android hỗ trợ phân giải mã SMS tự động.

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, PhoneAuthCredential sẽ tự động được cung cấp có thể được sử dụng để đă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);
  },
);

xác minh không hoàn thành

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 ngạch SMS cho dự án đã vượt quá, thì một 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 của mình đã xảy ra lỗi tùy 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 với verificationIdresendToken ( resendToken lại chỉ được hỗ trợ trên thiết bị Android, thiết bị iOS sẽ luôn trả về giá trị null ).

Sau khi được kích hoạt, sẽ là thời điểm tốt để cập nhật giao diện người dùng ứng dụng của bạn để nhắc người dùng nhập mã SMS mà họ đang mong đợi. Khi mã SMS đã được nhập, bạn có thể kết hợp ID xác minh với mã SMS để tạo Thông tin 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 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 đối số forceResendingToken . Nếu thành công, tin nhắn SMS sẽ được gửi lại.

codeAutoRetrievalTimeout

Trên các thiết bị Android hỗ trợ phân giải mã SMS tự động, trình xử lý này sẽ được gọi nếu thiết bị chưa tự động phân giải tin nhắn SMS trong một khung thời gian nhất định. Khi khung thời gian trôi qua, thiết bị sẽ không cố gắng giải quyết bất kỳ tin nhắn đến nào nữa.

Theo mặc định, thiết bị đợi trong 30 giây tuy nhiên điều này có thể được tùy chỉnh với đố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 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 được cung cấp. Để tăng cường bảo mật và ngăn chặn thư rác, người dùng được yêu cầu chứng minh họ là con người bằng cách hoàn thành tiện ích reCAPTCHA của Google . Sau khi xác nhận, mã SMS sẽ được gửi.

SDK xác thực Firebase cho Flutter sẽ quản lý tiện ích reCAPTCHA ra khỏi hộp theo mặc định, tuy nhiên, cung cấp quyền kiểm soát cách nó được hiển thị và định cấu hình nếu được yêu cầu. Để 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 trước tiên sẽ kích hoạt tiện ích reCAPTCHA hiển thị. Người dùng phải hoàn thành 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 người dùng bằng cách cung cấp mã SMS cho phương thức confirm trên phản hồi ConfirmationResult đã giải quyết:

UserCredential userCredential = await confirmationResult.confirm('123456');

Giống như các quy trình đăng nhập khác, đăng nhập thành công sẽ kích hoạt mọi trình xử lý trạng thái xác thực mà bạn đã đăng ký trong toàn bộ ứ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 cung cấ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 cá thể RecaptchaVerifier tùy chọn có thể được sử dụng để quản lý tiện ích con. Theo mặc định, tiện ích con sẽ hiển thị dưới dạng tiện ích con ẩn khi quy trình đăng nhập được kích hoạt. Một widget "vô hình" sẽ xuất hiện dưới dạng một phương thức toàn trang trên đầu ứng dụng của bạn.

Tuy nhiên, có thể hiển thị một widget nội tuyến mà người dùng phải nhấn rõ ràng để tự xác minh.

Để thêm tiện ích con nội dòng, hãy chỉ định ID phần tử DOM vào đối số vùng container của 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 cung cấp đối số vùng container , tiện ích con sẽ được hiển thị là "ẩn".

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

Bạn có thể tùy ý thay đổi kích thước và chủ đề bằng cách tùy chỉnh đối số sizetheme như hình trên.

Cũng có thể lắng nghe các sự kiện, chẳng hạn như reCAPTCHA đã được hoàn thành bởi người dùng chưa, 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 cung cấp hỗ trợ cho các số điện thoại thử nghiệm cục bộ:

  1. Trên Bảng điều khiển Firebase, chọn nhà cung cấp xác thực "Điện thoại" và nhấp vào menu thả xuống "Số điện thoại để kiểm tra".
  2. Nhập số điện thoại mới (ví dụ: +44 7444 555666 ) và mã kiểm tra (ví dụ: 123456 ).

Nếu cung cấp số điện thoại thử nghiệm cho phương pháp verifyPhoneNumber hoặc signInWithPhoneNumber , sẽ không có SMS nào thực sự được gửi. Thay vào đó, bạn có thể cung cấp mã kiểm tra trực tiếp cho PhoneAuthProvider hoặc với trình xử lý kết quả xác nhận của signInWithPhoneNumber .