Bạn có thể sử dụ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 đă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 tiện ích đăng nhập thả xuống triển khai các luồng đăng nhập cho đăng nhập bằng số điện thoại, cũng như đăng nhập dựa trên mật khẩu và đăng nhập có liên kết -TRONG. 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 SDK Firebase.
Trước khi bắt đầu
- Nếu bạn chưa có, hãy thêm Firebase vào dự án Android của bạn .
- Trong tệp Gradle mô-đun (cấp ứng dụng) của bạn (thường là
<project>/<app-module>/build.gradle.kts
hoặc<project>/<app-module>/build.gradle
), hãy thêm phần phụ thuộc cho Xác thực Firebase Thư viện Android. Chúng tôi khuyên bạn nên sử dụng Firebase Android BoM để kiểm soát việc lập phiên bản thư viện.Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // 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-ktx") }
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 Firebase.
(Thay thế) Thêm phụ thuộc thư viện Firebase mà không cần sử dụng BoM
Nếu chọn không sử dụng Firebase BoM, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phụ thuộc của nó.
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ự khuyên 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-ktx:22.1.2") }
Java
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // 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 Firebase.
(Thay thế) Thêm phụ thuộc thư viện Firebase mà không cần sử dụng BoM
Nếu chọn không sử dụng Firebase BoM, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phụ thuộc của nó.
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ự khuyên 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:22.1.2") }
- 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 việc này từ bảng điều khiển Firebase .
- 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 làm như vậy. Xem Xác thực ứng dụng khách của bạn để biết thông tin về cách tìm hàm băm SHA-1 của ứng dụng của bạn.
mối quan tâm an ninh
Xác thực chỉ sử dụng một số điện thoại, mặc dù thuận tiện, nhưng lại kém an toàn hơn so với các phương pháp khả dụng khác, bởi vì việc sở hữu một số điện thoại có thể dễ dàng chuyển giao giữa những người dùng. Ngoài ra, trên các thiết bị có nhiều hồ sơ người dùng, 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, thì bạn nên 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ề những đánh đổi bảo mật khi sử dụng tính năng đăng nhập bằng số điện thoại.
Bật đăng nhập 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 phương thức đăng nhập bằng Số điện thoại cho dự án Firebase của mình:
- Trong bảng điều khiển Firebase , hãy mở phần Xác thực .
- Trên trang Phương thức đăng nhập , bật phương thức đăng nhập Số điện thoại .
Hạn ngạch 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 không bị ảnh hưởng. Tuy nhiên, nếu bạn cần đăng nhập một lượng lớn người dùng bằng xác thực qua điện thoại, bạn có thể cần phải nâng cấp gói giá của mình. Xem trang giá cả .
Bật xác minh ứng dụng
Để sử dụng xác thực số điện thoại, Firebase phải có khả năng xác minh rằng các yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. Có ba cách Xác thực Firebase thực hiện việc này:
- API Tính toàn vẹn của Play : Nếu người dùng có thiết bị đã cài đặt các dịch vụ của Google Play và Xác thực Firebase có thể xác minh thiết bị là hợp pháp với API Tính toàn vẹn của Play , thì quá trình đăng nhập bằng số điện thoại có thể tiếp tục. API Tính toàn vẹn của Play được bật trên dự án do Google sở hữu bằng Xác thực Firebase, chứ không phải trên dự án của bạn. Điều này không đóng góp vào bất kỳ hạn ngạch API Tính toàn vẹn nào của Play trong dự án của bạn. Hỗ trợ tính toàn vẹn của Play khả dụng với SDK xác thực v21.2.0+ (Firebase BoM v31.4.0+).
Để sử dụng Tính toàn vẹn của Play, nếu bạn chưa chỉ định vân tay SHA-256 cho ứng dụng của mình, hãy làm như vậy từ cài đặt Dự án của bảng điều khiển Firebase. Tham khảo Xác thực ứng dụng khách của bạn để biết chi tiết về cách nhận dấu vân tay SHA-256 của ứng dụng.
- xác minh reCAPTCHA : Trong trường hợp không thể sử dụng 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, Xác thực Firebase sẽ sử dụng xác minh reCAPTCHA để hoàn tất quy trình đăng nhập qua điện thoại. Thử thách reCAPTCHA thường có thể được hoàn thành mà người dùng không cần phải giải quyết bất cứ điều gì. Lưu ý rằng quy trình này yêu cầu SHA-1 được liên kết với ứng dụng của bạn. Luồng này cũng yêu cầu Khóa API của bạn không bị hạn chế hoặc nằm trong danh sách cho phép đối với
PROJECT_ID .firebaseapp.com
.Một số tình huống mà reCAPTCHA được kích hoạt:
- Nếu thiết bị của người dùng cuối chưa cài đặt dịch vụ của Google Play.
- Nếu ứng dụng không được phân phối qua cửa hàng Google Play (trên Authentication SDK v21.2.0+ ).
- Nếu mã thông báo SafetyNet thu được không hợp lệ (trên các phiên bản SDK xác thực < v21.2.0).
Khi SafetyNet hoặc Play Integrity được sử dụng để xác minh ứng dụng, trường
%APP_NAME%
trong mẫu SMS được điền bằng tên ứng dụng được xác định từ cửa hàng Google Play. Trong các trường hợp kích hoạt reCAPTCHA,%APP_NAME%
được điền làPROJECT_ID .firebaseapp.com
.
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ụngsetAppVerificationDisabledForTesting
.Xử lý sự cố
Lỗi "Thiếu trạng thái ban đầu" 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 trở 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, việc mở 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 để cho phép 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 cung cấp cho người dùng một giao diện nhắc họ nhập số điện thoại của họ. Các yêu cầu pháp lý khác nhau, nhưng theo phương pháp hay nhất và để đặt kỳ vọng cho người dùng của bạn, bạn nên thông báo cho họ 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à áp dụng mức phí tiêu chuẩn.
Sau đó, chuyển số điện thoại của họ cho phương thức
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
được gửi lại: 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ứconStart
của một hoạt động, thì phương thứcverifyPhoneNumber
sẽ không gửi SMS thứ hai trừ khi yêu cầu ban đầu đã hết thời gian chờ.Bạn có thể sử dụng hành vi này để tiếp tục quy trình đăng nhập số điện thoại nếu ứng dụng của bạn đó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 cờ cho biết quá trình xác minh đang diễn ra. Sau đó, lưu cờ trong phương thứconSaveInstanceState
của Hoạt động của bạn và khôi phục cờ trongonRestoreInstanceState
. Cuối cùng, trong phương thứconStart
của Hoạt động của bạn, hãy kiểm tra xem quá trình xác minh đã được tiến hành chưa và nếu có, hãy gọi lạiverifyPhoneNumber
. Đảm bảo xóa cờ khi quá trình xác minh hoàn tất hoặc không thành công (xem Cuộc gọi lại xác minh ).Để dễ dàng xử lý xoay màn hình và các trường hợp khởi động lại Hoạt động khác, hãy chuyển Hoạt động của bạn sang phương thức
verifyPhoneNumber
. Các cuộc gọi lại sẽ được tự động tách ra khi Hoạt động dừng lại, vì vậy bạn có thể tự do viết mã chuyển đổi giao diện người dùng trong các phương thức gọi lại.Tin nhắn SMS do Firebase gửi cũng có thể được bản địa hóa bằng cách chỉ định ngôn ngữ xác thực thông qua phương thức
setLanguageCode
trên phiên bản Auth của bạn.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 bạn gọi
PhoneAuthProvider.verifyPhoneNumber
, bạn cũng phải cung cấp một phiên bảnOnVerificationStateChangedCallbacks
, chứa các triển khai chức năng gọi lại 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; } };
gọi lại xác minh
Trong hầu hết các ứng dụng, bạn triển khai các lệnh gọi lại
onVerificationCompleted
,onVerificationFailed
vàonCodeSent
. Bạn cũng có thể triển khaionCodeAutoRetrievalTimeOut
, tùy thuộc vào yêu cầu của ứng dụng.onVerificationCompleted(PhoneAuthCredential)
Phương pháp này được gọi trong hai tình huống:
- Xác minh tức thì: trong một số trường hợp, số điện thoại có thể được xác minh ngay lập tức mà không cần gửi hoặc nhập mã xác minh.
- Tự động truy xuất: trên một số thiết bị, các dịch vụ của Google Play có thể tự động phát hiệ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. (Khả năng này có thể không khả dụng với một số nhà cung cấp dịch vụ.) Tính năng này sử dụng API Trình truy xuất SMS , bao gồm hàm băm 11 ký tự ở cuối tin nhắn SMS.
PhoneAuthCredential
được chuyển đến lệnh gọi lại để đăng nhập người dùng .onVerificationFailed(FirebaseException)
Phương thức này được gọi để phản hồi yêu cầu xác minh không hợp lệ, chẳng hạn như yêu cầu chỉ định số điện thoại hoặc mã xác minh không hợp lệ.
onCodeSent(String verifyId, PhoneAuthProvider.ForceResendingToken)
Không bắt buộc. Phương pháp này được gọi sau khi mã xác minh đã được gửi qua 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 các ứng dụng sẽ 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. (Đồng thời, quá trình xác minh tự động có thể đang diễn ra ở 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à ID xác minh đã được chuyển cho phương thức để tạo đối tượng
PhoneAuthCredential
. đến lượt bạn có thể sử dụng để đăng nhập người dùng. Tuy nhiên, một số ứng dụng có thể đợi cho đến khionCodeAutoRetrievalTimeOut
đượ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(ID xác minh chuỗi)
Không bắt buộc. Phương pháp này được gọi sau khi khoảng thời gian chờ được chỉ định để
verifyPhoneNumber
trôi qua mà không kích hoạtonVerificationCompleted
trước. Trên các thiết bị không có thẻ SIM, phương pháp này được gọi ngay lập tức vì không thể tự động truy xuất SMS.Một số ứng dụng chặn đầu vào của người dùng cho đến khi hết thời gian xác minh tự động và chỉ khi đó mới 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 được khuyến nghị).
Tạo một đố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 của người dùng, hãy tạo một đối tượng
PhoneAuthCredential
, sử dụng mã xác minh và ID xác minh đã được chuyển đến lệnh gọi lạionCodeSent
hoặconCodeAutoRetrievalTimeOut
. (KhionVerificationCompleted
được gọi, bạn sẽ nhận được một đối tượngPhoneAuthCredential
trực tiếp, vì vậy bạn có thể bỏ qua bước này.)Để tạo đối tượng
PhoneAuthCredential
, hãy gọiPhoneAuthProvider.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 một đối tượng
PhoneAuthCredential
, cho dù trong cuộc gọi lạionVerificationCompleted
hay bằng cách gọiPhoneAuthProvider.getCredential
, hãy hoàn tất quy trình đăng nhập bằng cách chuyển đối tượngPhoneAuthCredential
tớiFirebaseAuth.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 với số điện thoại hư cấu
Bạn có thể thiết lập các số điện thoại hư cấu để phát triển thông qua bảng điều khiển Firebase. Thử nghiệm với các số điện thoại hư cấu mang lại những lợi ích sau:
- Kiểm tra xác thực số điện thoại mà không tiêu tốn dung lượng sử dụng của bạn.
- Kiểm tra xác thực số điện thoại mà không gửi tin nhắn SMS thực.
- Chạy thử nghiệm liên tiếp với cùng một số điện thoại mà không bị điều chỉnh. Điều này giảm thiểu rủi ro bị từ chối trong quá trình đánh giá Cửa hàng ứng dụng nếu người đánh giá tình cờ sử dụng cùng một số điện thoại để thử nghiệm.
- Thử nghiệm dễ dàng trong môi trường phát triển mà không cần thêm bất kỳ nỗ lực nào, chẳng hạn như khả năng phát triển trong trình giả lập iOS hoặc trình giả lập Android mà không cần Dịch vụ của Google Play.
- Viết các bài kiểm tra tích hợp mà không bị chặn bởi kiểm tra bảo mật thường được áp dụng trên các 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:
- Đảm bảo rằng bạn sử dụng các số điện thoại thực sự hư cấu và chưa tồn tại. Xác thực Firebase không cho phép bạn đặt các số điện thoại hiện có được người dùng thực sử dụng làm số kiểm tra. Một tùy chọn là sử dụng các số có tiền tố 555 làm số điện thoại thử nghiệm ở Hoa Kỳ, ví dụ: +1 650-555-3434
- Số điện thoại phải được định dạng chính xác về độ dài và các ràng buộc khác. Chúng vẫn sẽ trải qua quá trình xác thực giống như số điện thoại của người dùng thực.
- Bạn có thể thêm tối đa 10 số điện thoại để phát triển.
- Sử dụng các số điện thoại/mã kiểm tra khó đoán và thay đổi chúng thường xuyên.
Tạo số điện thoại hư cấu và mã xác minh
- Trong bảng điều khiển Firebase , hãy mở phần Xác thực .
- Trong tab Phương thức đăng nhập , hãy bật Nhà cung cấp điện thoại nếu bạn chưa bật.
- Mở menu Số điện thoại để kiểm tra đàn accordion.
- Cung cấp số điện thoại bạn muốn kiểm tra, ví dụ: +1 650-555-3434 .
- Cung cấp mã xác minh gồm 6 chữ số cho số cụ thể đó, ví dụ: 654321 .
- Thêm số. Nếu có nhu cầu, bạn có thể xóa số điện thoại và mã của nó bằng cách di chuột vào hàng tương ứng và nhấn vào biểu tượng thùng rác.
Kiểm tra bằng tay
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 ứng dụng của mình. Điều này cho phép bạn thực hiện kiểm tra thủ công trong các giai đoạn phát triển mà không gặp phải các vấn đề về hạn ngạch hoặc điều tiết. Bạn cũng có thể kiểm tra trực tiếp từ trình giả lập iOS hoặc trình giả lập Android mà không cần cài đặt Dịch vụ của Google Play.
Khi bạn cung cấp số điện thoại hư cấu và gửi mã xác minh, sẽ không có tin nhắn SMS thực nào được 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 đăng nhập.
Khi hoàn tất đăng nhập, người dùng Firebase được tạo bằng số điện thoại đó. 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 thời gian thực/Cloud Firestore và các dịch vụ khác theo cùng một cách. Mã thông báo ID được đúc trong quá trình này có chữ ký giống như người dùng số điện thoại thực.
Một tùy chọn khác là đặt vai trò thử nghiệm thông qua xác nhận quyền sở hữu tùy chỉnh đố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ế quyền truy cập hơn nữa.
Để kích hoạt luồng reCAPTCHA theo cách thủ công để thử nghiệm, hãy sử dụng phương thức
forceRecaptchaFlowForTesting()
.// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
Thử nghiệm hội nhập
Ngoài thử nghiệm thủ công, Xác thực Firebase cung cấp API để giúp viết các thử nghiệm tích hợp cho thử nghiệm xác thực điện thoại. Các API này vô hiệu hóa xác minh ứng dụng bằng cách vô hiệu hóa yêu cầu reCAPTCHA trên web và thông báo đẩy im lặng trong iOS. Điều này làm cho thử nghiệm tự động hóa có thể thực hiện được trong các luồng này và dễ triển khai hơn. Ngoài ra, chúng giúp cung cấp khả năng kiểm tra các luồng xác minh tức thời trên Android.
Trên Android, gọi
setAppVerificationDisabledForTesting()
trước lệnh gọisignInWithPhoneNumber
. Thao tác này sẽ tự động tắt xác minh ứng dụng, cho phép bạn chuyển số điện thoại mà không cần giải quyết thủ công. Mặc dù tính toàn vẹn của Play và reCAPTCHA bị vô hiệu hóa, nhưng việc sử dụng số điện thoại thực sẽ vẫn không thể hoàn tất đăng nhập. Chỉ các số điện thoại hư cấu mới có thể được sử dụng với API này.// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
Gọi
verifyPhoneNumber
bằng một số hư cấu sẽ kích hoạt lệnh gọi lạionCodeSent
, trong đó bạn sẽ cần cung cấp mã xác minh tương ứng. Điều này cho phép thử nghiệm trong Trình giả lập 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 tra luồng tự động truy xuất trong Android bằng cách đặt số hư cấu và mã xác minh tương ứng của số đó để tự động truy xuất bằng cách gọi
setAutoRetrievedSmsCodeForPhoneNumber
.Khi
verifyPhoneNumber
được gọi, nó sẽ kích hoạt trực tiếponVerificationCompleted
vớiPhoneAuthCredential
. Điều này chỉ hoạt động với số điện thoại hư cấu.Đảm bảo tính năng này bị tắt và không có số điện thoại hư cấu nào được mã hóa cứng trong ứng dụng của bạn khi xuất bản ứng dụng của bạn 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)
Bước tiếp theo
Sau khi người dùng đăng nhập lần đầu tiên, tài khoản người dùng mới được tạo và liên kết với thông tin đăng nhập—nghĩa là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp xác thực—người dùng đã đăng nhập bằng. Tài khoản mới này được lưu trữ như một phần của dự án Firebase của bạn và có thể được sử dụng để xác định 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 các ứ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 thời gian thực Firebase và Quy tắc bảo mật bộ lưu trữ đám mây , bạn có thể lấy ID người dùng duy nhất của người dùng đã đăng nhập từ biến
auth
và sử dụng biến đó để kiểm soát 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 nhà cung cấp xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp xác thực với tài khoản người dùng hiện có.
Để đăng xuất người dùng, hãy gọi
signOut
:Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
Trừ khi có lưu ý khác, nội dung của trang này được cấp phép theo Giấy phép ghi nhận tác giả 4.0 của Creative Commons và các mẫu mã lập trình được cấp phép theo Giấy phép Apache 2.0. Để biết thông tin chi tiết, vui lòng tham khảo Chính sách trang web của Google Developers. Java là nhãn hiệu đã đăng ký của Oracle và/hoặc các đơn vị liên kết với Oracle.
Cập nhật lần gần đây nhất: 2023-09-29 UTC.
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Thiếu thông tin tôi cần" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Quá phức tạp/quá nhiều bước" },{ "type": "thumb-down", "id": "outOfDate", "label":"Đã lỗi thời" },{ "type": "thumb-down", "id": "translationIssue", "label":"Vấn đề về bản dịch" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Vấn đề về mẫu/mã" },{ "type": "thumb-down", "id": "otherDown", "label":"Khác" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Dễ hiểu" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Giúp tôi giải quyết được vấn đề" },{ "type": "thumb-up", "id": "otherUp", "label":"Khác" }]