Xác thực bằng Firebase trên Android bằng Số điện thoại

Bạn có thể sử dụng tính năng Xác thực Firebase để đăng nhập người dùng bằng cách gửi tin nhắn SMS đến điện thoại của người dùng. Người dùng đăng nhập bằng mã một lần có trong Tin nhắn SMS.

Cách dễ nhất để thêm thông tin đăng nhập bằng số điện thoại vào ứng dụng của bạn là sử dụng FirebaseUI, bao gồm một tiện ích đăng nhập giúp triển khai quy trình đăng nhập cho điện thoại đăng nhập bằng số cũng như đăng nhập liên kết và dựa trên mật khẩu. Tài liệu này mô tả cách triển khai quy trình đăng nhập bằng số điện thoại bằng Firebase SDK.

Trước khi bắt đầu

  1. Nếu bạn chưa làm như vậy, thêm Firebase vào dự án Android của bạn.
  2. Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là <project>/<app-module>/build.gradle.kts hoặc <project>/<app-module>/build.gradle), thêm phần phụ thuộc cho Thư viện xác thực Firebase cho Android. Bạn nên sử dụng Bảng kê khai thành phần của Firebase cho Android để kiểm soát việc tạo phiên bản thư viện.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    Bằng cách sử dụng Firebase Android BoM, ứng dụng của bạn sẽ luôn sử dụng các phiên bản tương thích của thư viện Android trên Firebase.

    (Phương án thay thế) Thêm các phần phụ thuộc của thư viện Firebase mà không sử dụng BoM

    Nếu chọn không sử dụng BoM của Firebase, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phụ thuộc.

    Lưu ý rằng nếu bạn sử dụng nhiều thư viện Firebase trong ứng dụng của mình, chúng tôi thực sự bạn nên sử dụng BoM để quản lý các phiên bản thư viện. Điều này đảm bảo rằng tất cả các phiên bản đều tương thích.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.0.0")
    }
    
    Bạn đang tìm một mô-đun thư viện dành riêng cho Kotlin? Bắt đầu sau Tháng 10 năm 2023 (Firebase BoM 32.5.0), cả nhà phát triển Kotlin và Java đều có thể phụ thuộc vào mô-đun thư viện chính (để biết thông tin chi tiết, hãy xem Câu hỏi thường gặp về sáng kiến này).
  3. Nếu bạn chưa kết nối ứng dụng của mình với dự án Firebase, hãy thực hiện từ bảng điều khiển của Firebase.
  4. 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 của Firebase, làm như vậy. Xem Xác thực ứng dụng của bạn để biết thông tin về cách tìm SHA-1 của ứng dụng hàm băm.

Các mối lo ngại về bảo mật

Xác thực chỉ dùng số điện thoại, mặc dù thuận tiện nhưng lại kém an toàn so với các phương thức hiện có khác, do sở hữu số điện thoại có thể dễ dàng chuyển giữa những người dùng. Ngoài ra, trên các thiết bị có nhiều người dùng hồ sơ, bất kỳ người dùng nào có thể nhận tin nhắn SMS đều có thể đăng nhập vào tài khoản bằng số điện thoại của thiết bị.

Nếu bạn sử dụng tính năng đăng nhập dựa trên số điện thoại trong ứng dụng của mình, bạn sẽ cung cấp tính năng này cùng với các phương thức đăng nhập an toàn hơn và thông báo cho người dùng về tính bảo mật đánh đổi khi sử dụng đăng nhập bằng số điện thoại.

Bật tính năng đăng nhập bằng số điện thoại cho dự án Firebase của bạn

Để đăng nhập người dùng bằng SMS, trước tiên bạn phải bật tính năng đăng nhập bằng số điện thoại cho dự án Firebase của bạn:

  1. Trong bảng điều khiển của Firebase, hãy mở phần Xác thực.
  2. Trên trang Phương thức đăng nhập, bật Số điện thoại đăng nhập.

Hạn mức yêu cầu đăng nhập bằng số điện thoại của Firebase đủ cao để hầu hết các ứng dụng sẽ không bị ảnh hưởng. Tuy nhiên, nếu bạn cần đăng nhập vào một lượng người dùng rất lớn khi xác thực qua điện thoại, bạn có thể phải nâng cấp gói giá. Xem trang giá.

Bật tính năng xác minh ứng dụng

Để sử dụng phương thức xác thực số điện thoại, Firebase phải xác minh được rằng yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. Có 3 cách Tính năng Xác thực Firebase hoàn thành việc này:

  • API Tính toàn vẹn của Play: Nếu người dùng đã cài đặt thiết bị có Dịch vụ Google Play, và tính năng Xác thực Firebase có thể xác minh thiết bị là hợp lệ bằng API Tính toàn vẹn của Play, có thể tiếp tục đăng nhập bằng số điện thoại. API Tính toàn vẹn của Play được bật trên một dự án do Google sở hữu bằng cách Xác thực Firebase, không phải trên dự án của bạn. Dữ liệu này không ảnh hưởng đến API Tính toàn vẹn của Play hạn mức cho dự án của bạn. Dịch vụ Hỗ trợ về tính toàn vẹn của Play được cung cấp với SDK xác thực phiên bản 21.2.0 trở lên (Firebase BoM phiên bản 31.4.0 trở lên).

    Để sử dụng API Tính toàn vẹn của Play, nếu bạn chưa chỉ định vân tay số SHA-256 của ứng dụng, hãy thực hiện từ Dự án cài đặt của bảng điều khiển của Firebase. Tham khảo Xác thực Ứng dụng để biết thông tin chi tiết về cách lấy vân tay số SHA-256 của ứng dụng.

  • Xác minh reCAPTCHA: Trong trường hợp không thể sử dụng API Tính toàn vẹn của Play, chẳng hạn như khi người dùng có thiết bị chưa cài đặt Dịch vụ Google Play, tính năng Xác thực Firebase sử dụng quy trình xác minh reCAPTCHA để hoàn tất quy trình đăng nhập bằng điện thoại. Thử thách reCAPTCHA có thể thường được hoàn thành mà người dùng không phải giải quyết bất cứ điều gì. Xin lưu ý rằng quy trình này yêu cầu SHA-1 sẽ được liên kết với ứng dụng của bạn. Quy trình này cũng yêu cầu Khoá API của bạn không bị hạn chế hoặc có trong danh sách cho phép đối với PROJECT_ID.firebaseapp.com.

    Một số trường hợp kích hoạt reCAPTCHA:

    • Nếu thiết bị của người dùng cuối chưa cài đặt Dịch vụ Google Play.
    • Nếu ứng dụng không được phân phối thông qua Cửa hàng Google Play (trên SDK xác thực phiên bản 21.2.0 trở lên).
    • Nếu mã thông báo SafetyNet thu được không hợp lệ (trên phiên bản SDK xác thực < phiên bản 21.2.0).

    Khi SafetyNet hoặc API Tính toàn vẹn của Play được sử dụng để xác minh Ứng dụng, trường %APP_NAME% trong mẫu SMS sẽ được điền bằng tên ứng dụng do Cửa hàng Google Play xác định. Trong các trường hợp mà reCAPTCHA được kích hoạt, %APP_NAME% sẽ được điền là PROJECT_ID.firebaseapp.com.

Bạn có thể buộc quy trình xác minh reCAPTCHA bằng forceRecaptchaFlowForTesting Bạn có thể tắt xác minh ứng dụng (khi sử dụng số điện thoại hư cấu) bằng cách sử dụng setAppVerificationDisabledForTesting.

Khắc phục sự cố

  • "Thiếu trạng thái ban đầu" lỗi khi sử dụng reCAPTCHA để xác minh ứng dụng

    Điều này có thể xảy ra khi quy trình reCAPTCHA hoàn tất thành công nhưng không chuyển hướng người dùng quay lại ứng dụng gốc. Nếu điều này xảy ra, người dùng sẽ được chuyển hướng đến URL dự phòng PROJECT_ID.firebaseapp.com/__/auth/handler. Trên trình duyệt Firefox, tính năng mở đường liên kết ứng dụng gốc bị tắt theo mặc định. Nếu bạn thấy lỗi trên trên Firefox, hãy làm theo các bước trong Đặt Firefox dành cho Android để mở liên kết trong ứng dụng gốc để bật tính năng mở liên kết ứng dụng.

Gửi mã xác minh đến điện thoại của người dùng

Để bắt đầu đăng nhập bằng số điện thoại, hãy hiển thị cho người dùng một giao diện nhắc họ nhập số điện thoại của mình. Các yêu cầu pháp lý có thể khác nhau, nhưng tốt nhất là bạn nên làm theo và để đặt kỳ vọng cho người dùng, bạn nên cho họ biết rằng nếu họ sử dụng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và gửi có áp dụng cước phí.

Sau đó, chuyển số điện thoại của họ cho PhoneAuthProvider.verifyPhoneNumber để yêu cầu Firebase xác minh số điện thoại của người dùng. Ví dụ:

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

Phương thức verifyPhoneNumber là phương thức tái nhập: nếu bạn gọi phương thức này nhiều lần, chẳng hạn như trong phương thức onStart của một hoạt động, Phương thức verifyPhoneNumber sẽ không gửi tin nhắn SMS thứ hai trừ phi đã hết thời gian chờ cho yêu cầu ban đầu.

Bạn có thể sử dụng hành vi này để tiếp tục quy trình đăng nhập bằng số điện thoại nếu ứng dụng đóng trước khi người dùng có thể đăng nhập (ví dụ: trong khi người dùng đang sử dụng ứng dụng SMS của họ). Sau khi bạn gọi verifyPhoneNumber, hãy đặt một cờ cho biết rằng quy trình xác minh đang diễn ra. Sau đó, hãy lưu cờ trong phần Hoạt động của bạn onSaveInstanceState và khôi phục cờ trong onRestoreInstanceState. Cuối cùng, trong phần Hoạt động onStart, hãy kiểm tra xem quy trình xác minh đã diễn ra hay chưa và nếu có, hãy gọi lại verifyPhoneNumber. Hãy nhớ xoá cờ khi quá trình xác minh hoàn tất hoặc không thành công (xem Lệnh gọi lại để xác minh).

Để dễ dàng xử lý việc xoay màn hình và các trường hợp khác của Hoạt động khởi động lại, chuyển Hoạt động của bạn vào phương thức verifyPhoneNumber. Lệnh gọi lại sẽ được tự động phân tách khi Hoạt động dừng nên bạn có thể thoải mái ghi giao diện người dùng trong phương thức gọi lại.

Bạn cũng có thể bản địa hoá tin nhắn SMS do Firebase gửi bằng cách chỉ định ngôn ngữ xác thực thông qua phương thức setLanguageCode trên Xác thực của bạn thực thể.

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

Khi gọi PhoneAuthProvider.verifyPhoneNumber, bạn cũng phải cung cấp một thực thể của OnVerificationStateChangedCallbacks. chứa các cách triển khai hàm callback xử lý kết quả của yêu cầu. Ví dụ:

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Lệnh gọi lại để xác minh

Trong hầu hết ứng dụng, bạn cần triển khai onVerificationCompleted, Lệnh gọi lại onVerificationFailedonCodeSent. Bạn cũng có thể triển khai onCodeAutoRetrievalTimeOut, tùy thuộc vào các yêu cầu của ứng dụng.

onVerifyCompleted(PhoneAuthCredential)

Phương thức này được gọi trong 2 trường hợp:

  • Xác minh tức thì: trong một số trường hợp, số điện thoại có thể hiển thị ngay xác minh mà không cần gửi hay nhập mã xác minh.
  • Tự động truy xuất: Dịch vụ Google Play có thể trên một số thiết bị tự động phát hiện tin nhắn SMS xác minh đến và thực hiện xác minh mà không cần người dùng thực hiện hành động. (Bạn có thể không dùng được tính năng này với một số nhà mạng). Chiến dịch này sử dụng SMS Retriever API bao gồm một hàm băm 11 ký tự ở cuối tin nhắn SMS.
Trong cả hai trường hợp, số điện thoại của người dùng đã được xác minh thành công và bạn có thể dùng đối tượng PhoneAuthCredential được truyền đến lệnh gọi lại để đăng nhập cho người dùng.

onVerifyFailed(FirebaseException)

Phương thức này được gọi để phản hồi một yêu cầu xác minh không hợp lệ, chẳng hạn như làm yêu cầu chỉ định số điện thoại hoặc mã xác minh không hợp lệ.

onCodeSent(Mã xác minh chuỗi, PhoneAuthProvider.ForceSendingToken)

Không bắt buộc. Phương thức này được gọi sau khi mã xác minh được gửi qua tin nhắn SMS đến số điện thoại được cung cấp.

Khi phương thức này được gọi, hầu hết ứng dụng sẽ hiển thị một giao diện người dùng nhắc người dùng để nhập mã xác minh từ tin nhắn SMS. (Đồng thời, quy trình xác minh tự động có thể đang được tiến hành ở chế độ nền.) Sau đó, sau khi người dùng nhập mã xác minh, bạn có thể sử dụng mã xác minh và mã xác minh đã được chuyển đến phương thức để tạo một Đối tượng PhoneAuthCredential mà bạn có thể dùng để đăng nhập người dùng. Tuy nhiên, một số ứng dụng có thể đợi cho đến onCodeAutoRetrievalTimeOut được gọi trước khi hiển thị giao diện người dùng mã xác minh (không khuyến nghị).

onCodeAutoRetrievalTimeOut(String verificationId)

Không bắt buộc. Phương thức này được gọi sau khoảng thời gian chờ được chỉ định cho verifyPhoneNumber đã vượt qua mà không onVerificationCompleted kích hoạt đầu tiên. Trên các thiết bị không có SIM phương thức này được gọi ngay lập tức vì tự động truy xuất tin nhắn SMS không phải là nhất có thể.

Một số ứng dụng chặn hoạt động đầu vào của người dùng cho đến khi hết thời gian xác minh tự động. và chỉ hiển thị giao diện người dùng nhắc người dùng nhập mã xác minh từ tin nhắn SMS (không khuyến khích).

Tạo đối tượng PhoneAuthCredential

Sau khi người dùng nhập mã xác minh mà Firebase đã gửi đến điện thoại, hãy tạo đối tượng PhoneAuthCredential bằng phương thức xác minh và mã xác minh đã được chuyển đến onCodeSent hoặc Gọi lại onCodeAutoRetrievalTimeOut. (Thời điểm onVerificationCompleted được gọi, bạn sẽ nhận được trực tiếp đối tượng PhoneAuthCredential để bạn có thể bỏ qua bước này.)

Để tạo đối tượng PhoneAuthCredential, hãy gọi PhoneAuthProvider.getCredential:

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

Đăng nhập người dùng

Sau khi bạn nhận được đối tượng PhoneAuthCredential, cho dù trong Gọi lại onVerificationCompleted hoặc bằng cách gọi PhoneAuthProvider.getCredential, hãy hoàn tất quy trình đăng nhập trước truyền đối tượng PhoneAuthCredential đến FirebaseAuth.signInWithCredential:

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

Thử nghiệm bằng số điện thoại giả định

Bạn có thể thiết lập số điện thoại giả định để phát triển thông qua bảng điều khiển của Firebase. Kiểm thử bằng điện thoại hư cấu số mang lại các lợi ích sau:

  • Kiểm tra việc xác thực số điện thoại mà không làm tiêu tốn hạn mức sử dụng.
  • Kiểm tra xác thực số điện thoại mà không cần gửi tin nhắn SMS thực.
  • Chạy các thử nghiệm liên tiếp cho cùng một số điện thoại mà không bị điều tiết. Chiến dịch này giảm thiểu nguy cơ bị từ chối trong quá trình xem xét trên Cửa hàng ứng dụng nếu nhân viên đánh giá sử dụng cùng một số điện thoại để thử nghiệm.
  • Dễ dàng thử nghiệm trong các môi trường phát triển mà không cần làm gì thêm, chẳng hạn như khả năng phát triển trong trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần Dịch vụ Google Play.
  • Viết mã kiểm thử tích hợp mà không bị chặn bởi các quy trình kiểm tra bảo mật thường áp dụng số điện thoại thực trong môi trường sản xuất.

Số điện thoại hư cấu phải đáp ứng các yêu cầu sau:

  1. Đảm bảo bạn sử dụng số điện thoại thực sự là giả tưởng và chưa tồn tại. Tính năng Xác thực Firebase không cho phép bạn đặt số điện thoại hiện có mà người dùng thực sử dụng làm số thử nghiệm. Một lựa chọn là sử dụng số có tiền tố 555 làm số điện thoại thử nghiệm ở Hoa Kỳ, ví dụ: +1 650-555-3434
  2. Số điện thoại phải được định dạng chính xác về độ dài và hạn chế. Chúng vẫn sẽ được xác thực giống như số điện thoại của người dùng thực.
  3. Bạn có thể thêm tối đa 10 số điện thoại để phát triển.
  4. Sử dụng số điện thoại/mã thử nghiệm khó đoán và thay đổi được những thông tin đó thường xuyên.

Tạo số điện thoại giả và mã xác minh

  1. Trong bảng điều khiển của Firebase, hãy mở Phần Xác thực.
  2. Trong thẻ Phương thức đăng nhập, hãy bật Nhà cung cấp dịch vụ điện thoại nếu bạn chưa bật.
  3. Mở trình đơn đàn phong cầm Số điện thoại để thử nghiệm.
  4. Cung cấp số điện thoại mà bạn muốn kiểm tra, ví dụ: +1 650-555-3434.
  5. Hãy cung cấp mã xác minh gồm 6 chữ số cho số điện thoại cụ thể đó, ví dụ: 654321.
  6. Thêm số điện thoại. Nếu cần thiết, bạn có thể xoá số điện thoại và bằng cách di chuột qua hàng tương ứng và nhấp vào biểu tượng thùng rác.

Kiểm thử theo cách thủ công

Bạn có thể trực tiếp bắt đầu sử dụng một số điện thoại hư cấu trong đơn đăng ký của mình. Điều này cho phép bạn thực hiện kiểm thử thủ công trong các giai đoạn phát triển mà không gặp phải vấn đề về hạn mức hoặc điều tiết. Bạn cũng có thể kiểm thử trực tiếp từ trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần Dịch vụ Google Play .

Khi bạn cung cấp số điện thoại giả và gửi mã xác minh, không có tin nhắn SMS thực nào được cung cấp đã gửi. Thay vào đó, bạn cần cung cấp mã xác minh đã định cấu hình trước đó để hoàn tất việc ký tên trong năm

Khi hoàn tất đăng nhập, người dùng Firebase sẽ được tạo bằng số điện thoại đó. Chiến lược phát hành đĩa đơn người dùng có hành vi và thuộc tính giống như người dùng số điện thoại thực và có thể truy cập Cơ sở dữ liệu theo thời gian thực/Cloud Firestore và các dịch vụ khác theo cách tương tự. Mã thông báo mã nhận dạng đã được tạo trong khoảng thời gian quy trình này có cùng chữ ký với người dùng số điện thoại thực.

Một lựa chọn khác là đặt vai trò thử nghiệm thông qua tuỳ chỉnh xác nhận quyền sở hữu đối với những người dùng này để phân biệt họ là người dùng giả mạo nếu bạn muốn hạn chế hơn nữa truy cập.

Để kích hoạt quy trình reCAPTCHA cho mục đích thử nghiệm theo cách thủ công, hãy sử dụng forceRecaptchaFlowForTesting().

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

Kiểm thử tích hợp

Ngoài kiểm thử thủ công, tính năng Xác thực Firebase còn cung cấp các API để giúp viết mã kiểm thử tích hợp để kiểm tra tính xác thực của điện thoại. Các API này vô hiệu hoá tính năng xác minh ứng dụng bằng cách tắt reCAPTCHA trong web và thông báo đẩy im lặng trong iOS. Điều này giúp thử nghiệm tự động hoá có thể các quy trình này và dễ triển khai hơn. Ngoài ra, chúng giúp khả năng thử nghiệm phiên bản tức thì quy trình xác minh trên Android.

Trên Android, hãy gọi setAppVerificationDisabledForTesting() trước phương thức Cuộc gọi signInWithPhoneNumber. Thao tác này sẽ tự động vô hiệu hoá quy trình xác minh ứng dụng, cho phép bạn chuyển số điện thoại mà không cần phải giải mã theo cách thủ công. Mặc dù API Tính toàn vẹn của Play và reCAPTCHA đã bị tắt, nên bạn vẫn không thể sử dụng số điện thoại thực hoàn tất đăng nhập. Bạn chỉ có thể sử dụng các số điện thoại hư cấu với API này.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

Việc gọi verifyPhoneNumber bằng một số điện thoại hư cấu sẽ kích hoạt Lệnh gọi lại onCodeSent, trong đó bạn cần cung cấp thông tin xác minh tương ứng . Điều này cho phép kiểm thử trong Trình mô phỏng Android.

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Ngoài ra, bạn có thể kiểm thử luồng truy xuất tự động trong Android bằng cách đặt số hư cấu và mã xác minh tương ứng để tự động truy xuất bằng cách gọi setAutoRetrievedSmsCodeForPhoneNumber.

Khi verifyPhoneNumber là được gọi, nó kích hoạt onVerificationCompleted bằng PhoneAuthCredential trực tiếp. Tính năng này chỉ hoạt động với số điện thoại hư cấu.

Hãy đảm bảo bạn đã tắt tính năng này và không có số điện thoại hư cấu nào được cố định giá trị trong mã khi xuất bản ứng dụng lên Cửa hàng Google Play.

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Các bước tiếp theo

Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và được liên kết với thông tin đăng nhập—tức là tên người dùng và mật khẩu, số điện thoại số hoặc thông tin của nhà cung cấp dịch vụ xác thực – người dùng đã đăng nhập. Thông tin mới này được lưu trữ như một phần của dự án Firebase và có thể được dùng để xác định một người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.

  • Trong ứng dụng của mình, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ Đối tượng FirebaseUser. Xem Quản lý người dùng.

  • Trong Cơ sở dữ liệu theo thời gian thực của Firebase và Cloud Storage Quy tắc bảo mật, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến auth, để kiểm soát loại dữ liệu mà người dùng có thể truy cập.

Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của mình bằng nhiều phương thức xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp dịch vụ xác thực với tài khoản người dùng hiện có.

Để đăng xuất một người dùng, hãy gọi signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();