Bạn có thể sử dụng Firebase Authentication để đăng nhập cho 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 tính năng đăng nhập bằng số điện thoại vào ứng dụng là sử dụng FirebaseUI. FirebaseUI có một tiện ích đăng nhập tích hợp sẵn, giúp triển khai quy trình đăng nhập bằng số điện thoại, cũng như đăng nhập bằng mật khẩu và đăng nhập liên kết. 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
- Nếu bạn chưa thực hiện, hãy thêm Firebase vào dự án Android.
-
Trong tệp Gradle (ở cấp ứng dụng) trong mô-đun (thường là
<project>/<app-module>/build.gradle.ktshoặc<project>/<app-module>/build.gradle), hãy thêm phần phụ thuộc cho thư viện Firebase Authentication dành cho Android. Bạn nên sử dụng Firebase Android BoM để 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:35.1.0")) // 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 những phiên bản tương thích của thư viện Android trên Firebase.
(Cách khác) Thêm phần phụ thuộc thư viện Firebase mà không 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ần phụ thuộc của phiên bản đó.
Lưu ý rằng nếu bạn sử dụng nhiều thư viện Firebase trong ứng dụng, bạn nên sử dụng BoM để quản lý các phiên bản thư viện, nhằm đảm bảo rằng tất 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:25.0.0") }
- Nếu bạn chưa kết nối ứng dụng với dự án Firebase, hãy thực hiện việc này trong 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. 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.
Các mối lo ngại về bảo mật
Mặc dù thuận tiện, nhưng việc xác thực chỉ bằng số điện thoại sẽ kém an toàn hơn các phương thức khác, vì quyền sở hữu số điện thoại có thể dễ dàng được chuyển 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 sử dụng phương thức đăng nhập dựa trên số điện thoại trong ứng dụng, bạn nên cung cấp phương thức 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 rủi ro bảo mật khi sử dụng phương thức đă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ười dùng đăng nhập 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 chuyển đến phần Security (Bảo mật) > Authentication (Xác thực).
- Trong thẻ Sign-in method (Phương thức đăng nhập), hãy bật nhà cung cấp dịch vụ đăng nhập bằng Phone (Điện thoại).
-
Đặt chính sách cho những khu vực mà bạn muốn cho phép hoặc từ chối
gửi tin nhắn SMS. Việc đặt chính sách về khu vực gửi tin nhắn SMS có thể giúp bảo vệ ứng dụng của bạn khỏi hành vi sử dụng sai mục đích tin nhắn SMS. Đối với các dự án mới, chính sách mặc định không cho phép khu vực nào.
- Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Security (Bảo mật) > Authentication (Xác thực) > Settings (Cài đặt).
- Trong mục Chính sách về khu vực gửi tin nhắn SMS, hãy thiết lập chính sách về khu vực gửi tin nhắn SMS.
Bật tính năng xác minh ứng dụng
Để sử dụng tính năng xác thực số điện thoại, Firebase phải xác minh được 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 Firebase Authentication thực hiện việc này:
- Play Integrity API: Nếu người dùng có thiết bị đã cài đặt Google Play services và Firebase Authentication có thể xác minh thiết bị đó là hợp lệ bằng Play Integrity API, thì quá trình đăng nhập bằng số điện thoại có thể tiếp tục. Play Integrity API được bật trên một dự án do Google sở hữu theo
Firebase Authentication, chứ không phải trên dự án của bạn. Việc này không ảnh hưởng đến hạn mức của Play Integrity API
trong dự án của bạn. Dịch vụ hỗ trợ Play Integrity được cung cấp trong
Authentication SDK 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 Play Integrity, hãy chỉ định vân tay số SHA-256 của ứng dụng nếu bạn chưa làm việc này.
-
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ
Cài đặt > Chung. - Di chuyển xuống thẻ Ứng dụng của bạn, chọn ứng dụng Android rồi thêm vân tay số SHA-256 vào trường Vân tay số chứng chỉ SHA.
Hãy xem bài viết Xác thực ứng dụng của bạn để biết thông tin chi tiết về cách lấy vân tay số SHA của ứng dụng.
-
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ
- Xác minh bằng dịch vụ reCAPTCHA: Trong trường hợp không thể sử dụng Play Integrity, chẳng hạn như khi người dùng có thiết bị chưa cài đặt Google Play services, Firebase Authentication sẽ sử dụng phương thức xác minh bằng dịch vụ reCAPTCHA để hoàn tất quy trình đăng nhập bằng điện thoại. Người dùng thường có thể hoàn tất hình ảnh xác thực reCAPTCHA mà không cần phải giải bất cứ câu đố nào. Xin lưu ý rằng quy trình này yêu cầu bạn phải liên kết một SHA-1 với ứng dụng của mình. 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 đưa vào 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 Google Play services.
- Nếu ứng dụng không được phân phối thông qua Google Play Store (trên Authentication SDK phiên bản 21.2.0 trở lên).
- Nếu mã thông báo SafetyNet nhận được không hợp lệ (trên các phiên bản SDK Authentication < phiên bản 21.2.0).
Khi SafetyNet hoặc Play Integrity được dùng để xác minh ứng dụng, trường
%APP_NAME%trong mẫu SMS sẽ được điền tên ứng dụng được xác định từ Google Play Store. Trong các trường hợp reCAPTCHA được kích hoạt,%APP_NAME%sẽ được điền sẵn dưới dạngPROJECT_ID.firebaseapp.com.
forceRecaptchaFlowForTesting
Bạn có thể tắt tính năng xác minh ứng dụng (khi sử dụng số điện thoại giả định) bằng
setAppVerificationDisabledForTesting.
Khắc phục 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, tính năng mở đường liên kết đến ứng dụng gốc bị tắt theo mặc định. Nếu bạn thấy lỗi nêu trên trong Firefox, hãy làm theo các bước trong bài viết Đặt Firefox cho Android mở đường liên kết trong ứng dụng gốc để bật tính năng mở đường liên kết trong ứ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. Yêu cầu pháp lý có thể khác nhau, nhưng để đảm bảo tuân thủ và đặt ra kỳ vọng cho người dùng, bạn nên thông báo cho họ biết rằng nếu sử dụng tính năng đăng nhập bằng số đ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 đó, hãy chuyển số điện thoại của họ đến 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
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ó thể tái truy cậ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, thì phương thức verifyPhoneNumber sẽ không gửi tin nhắn SMS thứ hai trừ phi 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 bằng 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ụ: khi người dùng đang sử dụng ứng dụng SMS). Sau khi bạn gọi verifyPhoneNumber, hãy đặt một cờ cho biết quá trình xác minh đang diễn ra. Sau đó, lưu cờ trong phương thức onSaveInstanceState của Hoạt động và khôi phục cờ trong onRestoreInstanceState. Cuối cùng, trong phương thức onStart của Hoạt động, hãy kiểm tra xem quá trình xác minh có đang diễn ra hay không 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 phần
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 khi khởi động lại Hoạt động, hãy truyền Hoạt động của bạn đến phương thức verifyPhoneNumber. Các lệnh gọi lại sẽ tự động tách rời khi Hoạt động dừng, vì vậy, bạn có thể thoải mái 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 hoá bằng cách chỉ định ngôn ngữ xác thực thông qua phương thức setLanguageCode trên thực thể Xác thực của bạn.
Kotlin
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, trong đó có các phương thức triển khai hàm callback xử lý kết quả của yêu cầu. Ví dụ:
Kotlin
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 các ứng dụng, bạn sẽ triển khai các lệnh gọi lại onVerificationCompleted, onVerificationFailed và onCodeSent. Bạn cũng có thể triển khai onCodeAutoRetrievalTimeOut, tuỳ thuộc vào yêu cầu của ứng dụng.
onVerificationCompleted(PhoneAuthCredential)
Phương thức này được gọi trong hai 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ể đượ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ị, Dịch vụ Google Play có thể 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 thao tác. (Tính năng này có thể không dùng được với một số nhà mạng.) Phương thức 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.
PhoneAuthCredential được truyề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 một 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 verificationId, PhoneAuthProvider.ForceResendingToken)
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 SMS đến số điện thoại đã 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ị 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 tự động xác minh có thể đang diễn ra ở chế độ nền.) Sau đó, khi người dùng nhập mã xác minh, bạn có thể dùng mã xác minh và mã xác minh đã được chuyển đến phương thức để tạo đối tượng PhoneAuthCredential. Sau đó, bạn có thể dùng đối tượng này để đăng nhập cho người dùng. Tuy nhiên, một số ứng dụng có thể đợi cho đến khi onCodeAutoRetrievalTimeOut được gọi trước khi hiển thị giao diện người dùng mã xác minh (không nên dùng).
onCodeAutoRetrievalTimeOut(String verificationId)
Không bắt buộc. Phương thức này được gọi sau khi thời gian chờ được chỉ định cho verifyPhoneNumber đã trôi qua mà không kích hoạt onVerificationCompleted trước. Trên các thiết bị không có thẻ SIM, phương thức này được gọi ngay lập tức vì không thể tự động tải xuống SMS.
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 tự động xác minh, sau đó 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 nên dùng).
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 của người dùng, hãy tạo một đối tượng PhoneAuthCredential bằng cách sử dụng mã xác minh và mã xác minh đã được chuyển đến lệnh gọi lại onCodeSent hoặc onCodeAutoRetrievalTimeOut. (Khi gọi onVerificationCompleted, bạn sẽ nhận được trực tiếp đối tượng PhoneAuthCredential, vì vậy, bạn có thể bỏ qua bước này.)
Để tạo đối tượng PhoneAuthCredential, hãy gọi PhoneAuthProvider.getCredential:
Kotlin
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ù là trong lệnh gọi lại onVerificationCompleted hay bằng cách gọi PhoneAuthProvider.getCredential, hãy hoàn tất quy trình đăng nhập bằng cách truyền đối tượng PhoneAuthCredential đến FirebaseAuth.signInWithCredential:
Kotlin
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 } } } }); }
Kiểm thử bằng số điện thoại giả định
Bạn có thể thiết lập số điện thoại giả định cho mục đích phát triển bằng bảng điều khiển Firebase. Việc thử nghiệm bằng số điện thoại giả định mang lại những lợi ích sau:
- Thử nghiệm tính năng 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 của bạn.
- Kiểm thử quy trình xác thực số điện thoại mà không cần gửi tin nhắn SMS thực tế.
- Chạy các thử nghiệm liên tiếp bằng cùng một số điện thoại mà không bị điều tiết. Điều này giúp giảm thiểu nguy cơ bị từ chối trong quá trình xem xét của Cửa hàng ứng dụng nếu người đánh giá sử dụng cùng một số điện thoại để thử nghiệm.
- Dễ dàng kiểm thử trong môi trường phát triển mà không cần nỗ lực 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 các bài kiểm thử tích hợp mà không bị chặn bởi các bước kiểm tra bảo mật thường được áp dụng trên số điện thoại thực trong môi trường thực tế.
Số điện thoại hư cấu phải đáp ứng các yêu cầu sau:
- Hãy đảm bảo rằng bạn sử dụng số điện thoại hư cấu và chưa tồn tại. Firebase Authentication không cho phép bạn đặt số điện thoại hiện có mà người dùng thực đang sử dụng làm số thử nghiệm. Một cách 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
- Số điện thoại phải được định dạng chính xác về độ dài và các quy tắc ràng buộc khác. Các số điện thoại này vẫn sẽ trải qua quy 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 số điện thoại/mã thử nghiệm khó đoán và thay đổi thường xuyên.
Tạo số điện thoại và mã xác minh giả định
- Trong bảng điều khiển Firebase, hãy chuyển đến phần Security (Bảo mật) > Authentication (Xác thực).
- Trong thẻ Sign-in method (Phương thức đăng nhập), hãy bật nhà cung cấp dịch vụ đăng nhập bằng Phone (Điện thoại) nếu bạn chưa bật.
- Mở rộng mục Số điện thoại để thử nghiệm.
-
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ố điện thoại cụ thể đó, ví dụ:
654321. - Nhấp vào Thêm cho mỗi số. Nếu cần, bạn có thể xoá số điện thoại và mã của số điện thoại đó bằng cách di chuột qua hàng tương ứng rồi nhấp vào biểu tượng thùng rác.
Kiểm thử thủ công
Bạn có thể trực tiếp bắt đầu sử dụng số điện thoại giả định trong ứng dụng của mình. Nhờ đó, bạn có thể 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 cài đặt Dịch vụ Google Play.
Khi bạn cung cấp số điện thoại giả định và gửi mã xác minh, hệ thống sẽ không gửi tin nhắn SMS thực tế. Thay vào đó, bạn cần cung cấp mã xác minh đã thiết lập trước đó để hoàn tất quy trình đăng nhập.
Khi hoàn tất đăng nhập, một người dùng Firebase sẽ được tạo bằng số điện thoại đó. Người dùng này có hành vi và thuộc tính giống như người dùng số điện thoại thực, đồng thời có thể truy cập vào Realtime Database/Cloud Firestore và các dịch vụ khác theo cách tương tự. Mã thông báo giá trị nhận dạng được tạo trong quá 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 các thông báo xác nhận quyền sở hữu tuỳ chỉnh cho 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 quy trình reCAPTCHA theo cách thủ công cho mục đích kiểm thử, hãy sử dụng phương thức forceRecaptchaFlowForTesting().
// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
Kiểm thử tích hợp
Ngoài việc kiểm thử thủ công, Firebase Authentication còn cung cấp các API để giúp viết các bài kiểm thử tích hợp cho việc kiểm thử phương thức xác thực bằng điện thoại. Các API này tắt tính năng xác minh ứng dụng bằng cách tắt yêu cầu reCAPTCHA trong thông báo đẩy trên web và thông báo đẩy không có âm thanh trong iOS. Nhờ đó, bạn có thể kiểm thử tự động trong các quy trình này và dễ dàng triển khai hơn. Ngoài ra, các công cụ này còn giúp bạn thử nghiệm quy trình xác minh tức thì trên Android.
Trên Android, hãy gọi setAppVerificationDisabledForTesting() trước khi gọi signInWithPhoneNumber. Thao tác này sẽ tự động tắt tính năng 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 theo cách thủ công. Mặc dù Play Integrity và reCAPTCHA đã bị tắt, nhưng việc sử dụng số điện thoại thực vẫn không thể hoàn tất quy trình đăng nhập. Bạn chỉ có thể sử dụng số điện thoại giả định với API này.
// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
Khi gọi đến số verifyPhoneNumber bằng một số điện thoại giả định, lệnh gọi lại onCodeSent sẽ được kích hoạt. Trong lệnh gọi lại này, bạn 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 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
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ử quy trình tự động tải xuống trong Android bằng cách đặt số điện thoại giả định và mã xác minh tương ứng để tự động tải xuống bằng cách gọi setAutoRetrievedSmsCodeForPhoneNumber.
Khi verifyPhoneNumber được gọi, hàm này sẽ kích hoạt trực tiếp onVerificationCompleted bằng PhoneAuthCredential. Tính năng này chỉ hoạt động với số điện thoại giả định.
Hãy nhớ tắt tính năng này và không cố định giá trị số điện thoại giả trong mã của ứng dụng khi phát hành ứ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
// 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, một tài khoản người dùng mới sẽ được tạo và 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 hoặc thông tin của nhà cung cấp dịch vụ xác thực) mà người dùng đã dùng để đăng nhập. Tài khoản mới này được lưu trữ trong dự án Firebase của bạn và có thể được dùng để xác định người dùng trên mọi ứng dụng trong dự án, bất kể cách người dùng đăng nhập.
-
Trong ứng dụng, bạn có thể lấy thông tin cơ bản trong hồ sơ của người dùng từ đối tượng
FirebaseUser. Xem phần Quản lý người dùng. Trong Quy tắc bảo mật của Firebase Realtime Database và Cloud Storage, bạn có thể lấy mã nhận dạng người dùng riêng biệt của người dùng đã đăng nhập từ biến
authvà sử dụng mã nhận dạng đó để 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 dịch vụ xác thực bằng cách liên kết thông tin xác thực 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 người dùng, hãy gọi
signOut:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();