คุณสามารถใช้การตรวจสอบสิทธิ์ Firebase เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่มีอยู่ในข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปของคุณคือการใช้ FirebaseUI ซึ่งรวมถึงวิดเจ็ตการลงชื่อเข้าใช้แบบดรอปอินที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับการลงชื่อเข้าใช้หมายเลขโทรศัพท์ ตลอดจนการลงชื่อเข้าใช้แบบใช้รหัสผ่านและแบบรวมศูนย์ -ใน. เอกสารนี้อธิบายวิธีใช้งานขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนจะเริ่ม
- หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ Android ของคุณ
- ใช้ Firebase Android BoM ประกาศการพึ่งพาสำหรับไลบรารี Firebase Authentication Android ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ
app/build.gradle
)Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.3.1') // Declare 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' }
เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ
(ทางเลือก) ประกาศการพึ่งพาไลบรารี Firebase โดยไม่ ใช้ BoM
หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา
โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลายรายการ ในแอปของคุณ เราขอแนะนำให้ใช้ BoM เพื่อจัดการเวอร์ชันของไลบรารี ซึ่งจะทำให้มั่นใจได้ว่าทุกเวอร์ชันจะเข้ากันได้
dependencies { // Declare 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:21.0.7' }
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.3.1') // Declare 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' }
เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ
(ทางเลือก) ประกาศการพึ่งพาไลบรารี Firebase โดยไม่ ใช้ BoM
หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา
โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลายรายการ ในแอปของคุณ เราขอแนะนำให้ใช้ BoM เพื่อจัดการเวอร์ชันของไลบรารี ซึ่งจะทำให้มั่นใจได้ว่าทุกเวอร์ชันจะเข้ากันได้
dependencies { // Declare 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:21.0.7' }
- หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก คอนโซล Firebase
- หากคุณยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปใน คอนโซล Firebase ให้ดำเนินการดังกล่าว ดูการ ตรวจสอบสิทธิ์ไคลเอ็นต์ของคุณ สำหรับข้อมูลเกี่ยวกับการค้นหาแฮช SHA-1 ของแอป
ความกังวลด้านความปลอดภัย
การตรวจสอบสิทธิ์โดยใช้หมายเลขโทรศัพท์เพียงหมายเลขเดียวในขณะที่สะดวกนั้นมีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มี เนื่องจากการครอบครองหมายเลขโทรศัพท์สามารถถ่ายโอนระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ ในอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่สามารถรับข้อความ SMS สามารถลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์ได้
หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอปของคุณ คุณควรนำเสนอควบคู่ไปกับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยยิ่งขึ้น และแจ้งให้ผู้ใช้ทราบถึงข้อแลกเปลี่ยนด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้การลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase
ในการลงชื่อเข้าใช้ผู้ใช้ทาง SMS คุณต้องเปิดใช้งานวิธีการลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ของคุณก่อน:
- ใน คอนโซล Firebase ให้เปิดส่วนการ ตรวจสอบสิทธิ์
- ในหน้าวิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานวิธีการลงชื่อเข้าใช้ หมายเลขโทรศัพท์
โควต้าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์ของ Firebase สูงพอที่แอปส่วนใหญ่จะไม่ได้รับผลกระทบ อย่างไรก็ตาม หากคุณต้องการลงชื่อเข้าใช้ผู้ใช้จำนวนมากด้วยการตรวจสอบสิทธิ์ทางโทรศัพท์ คุณอาจต้องอัปเกรดแผนราคาของคุณ ดูหน้า ราคา
เปิดใช้งานการตรวจสอบแอป
ในการใช้การตรวจสอบหมายเลขโทรศัพท์ Firebase ต้องสามารถยืนยันได้ว่าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์นั้นมาจากแอปของคุณ การตรวจสอบสิทธิ์ Firebase ทำได้สองวิธี:
- SafetyNet : หากผู้ใช้มีอุปกรณ์ที่ติดตั้งบริการ Google Play และการตรวจสอบสิทธิ์ของ Firebase สามารถตรวจสอบอุปกรณ์ว่าถูกต้องด้วย Android SafetyNet การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สามารถดำเนินการต่อได้
- ใน Google Cloud Console ให้เปิดใช้งาน Android DeviceCheck API สำหรับโครงการของคุณ ระบบจะใช้คีย์ Firebase API เริ่มต้น และต้องได้รับอนุญาตให้เข้าถึง DeviceCheck API
- หากคุณยังไม่ได้ระบุลายนิ้วมือ SHA-256 ของแอป ให้ดำเนินการจาก หน้าการตั้งค่า ของคอนโซล Firebase อ้างถึงการ รับรองความถูกต้องไคลเอ็นต์ของคุณ สำหรับรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA-256 ของแอป
- การ ยืนยัน reCAPTCHA : ในกรณีที่ใช้ SafetyNet ไม่ได้ เช่น เมื่อผู้ใช้ไม่มีบริการ Google Play Services หรือเมื่อทดสอบแอปของคุณบนโปรแกรมจำลอง Firebase Authentication จะใช้การตรวจสอบ reCAPTCHA เพื่อทำให้ขั้นตอนการลงชื่อเข้าใช้ทางโทรศัพท์เสร็จสมบูรณ์ ความท้าทาย reCAPTCHA มักจะทำให้เสร็จได้โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย โปรดทราบว่าโฟลว์นี้กำหนดให้ SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ
วิธีเปิดใช้งาน SafetyNet สำหรับใช้กับการตรวจสอบสิทธิ์ Firebase:
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
ในการเริ่มต้นลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้พิมพ์หมายเลขโทรศัพท์ ข้อกำหนดทางกฎหมายแตกต่างกันไป แต่ตามแนวทางปฏิบัติที่ดีที่สุดและเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ของคุณ คุณควรแจ้งให้พวกเขาทราบว่าหากพวกเขาใช้การลงชื่อเข้าใช้ทางโทรศัพท์ พวกเขาอาจได้รับข้อความ SMS สำหรับการตรวจสอบและเป็นไปตามอัตรามาตรฐาน
จากนั้นส่งหมายเลขโทรศัพท์ไปยังวิธี
PhoneAuthProvider.verifyPhoneNumber
เพื่อขอให้ Firebase ตรวจสอบหมายเลขโทรศัพท์ของผู้ใช้ ตัวอย่างเช่น:Java
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(mAuth) .setPhoneNumber(phoneNumber) // Phone number to verify .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit .setActivity(this) // Activity (for callback binding) .setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks .build(); PhoneAuthProvider.verifyPhoneNumber(options);
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)
วิธี
verifyPhoneNumber
เป็น reentrant: หากคุณเรียกใช้หลายครั้ง เช่น ในวิธีการonStart
ของกิจกรรม วิธีverifyPhoneNumber
จะไม่ส่ง SMS ที่สอง เว้นแต่คำขอเดิมจะหมดเวลาคุณสามารถใช้พฤติกรรมนี้เพื่อดำเนินการลงชื่อเข้าใช้หมายเลขโทรศัพท์ต่อได้ หากแอปของคุณปิดก่อนที่ผู้ใช้จะลงชื่อเข้าใช้ได้ (เช่น ในขณะที่ผู้ใช้ใช้แอป SMS) หลังจากที่คุณโทร
verifyPhoneNumber
ให้ตั้งค่าสถานะที่ระบุว่ากำลังดำเนินการตรวจสอบ จากนั้นให้บันทึกแฟล็กในเมธอดonSaveInstanceState
ของ Activity ของคุณและกู้คืนแฟล็กในonRestoreInstanceState
สุดท้าย ในวิธีonStart
ของกิจกรรม ให้ตรวจสอบว่ากำลังดำเนินการยืนยันอยู่หรือไม่ และหากเป็นเช่นนั้น ให้โทรverifyPhoneNumber
อีกครั้ง อย่าลืมล้างแฟล็กเมื่อการยืนยันเสร็จสิ้นหรือล้มเหลว (ดู การยืนยันการโทรกลับ )หากต้องการจัดการการหมุนหน้าจอและการรีสตาร์ทกิจกรรมอื่นๆ อย่างง่ายดาย ให้ส่งกิจกรรมของคุณไปที่วิธี
verifyPhoneNumber
การเรียกกลับจะถูกแยกออกโดยอัตโนมัติเมื่อกิจกรรมหยุดลง ดังนั้นคุณจึงสามารถเขียนโค้ดการเปลี่ยน UI ได้อย่างอิสระในวิธีการโทรกลับข้อความ SMS ที่ส่งโดย Firebase ยังสามารถแปลเป็นภาษาท้องถิ่นได้ด้วยการระบุภาษารับรองความถูกต้องผ่านเมธอด
setLanguageCode
บนอินสแตนซ์ Auth ของคุณJava
auth.setLanguageCode("fr"); // To apply the default app language instead of explicitly setting it. // auth.useAppLanguage();
Kotlin+KTX
auth.setLanguageCode("fr") // To apply the default app language instead of explicitly setting it. // auth.useAppLanguage()
เมื่อคุณเรียกใช้
PhoneAuthProvider.verifyPhoneNumber
คุณต้องจัดเตรียมอินสแตนซ์ของOnVerificationStateChangedCallbacks
ด้วย ซึ่งมีการใช้งานฟังก์ชันเรียกกลับที่จัดการผลลัพธ์ของคำขอ ตัวอย่างเช่น:Java
mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { @Override public void onVerificationCompleted(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(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 } // 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; } };
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 } // 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 } }
การยืนยันการโทรกลับ
ในแอปส่วนใหญ่ คุณจะใช้การเรียกกลับ
onVerificationCompleted
,onVerificationFailed
และonCodeSent
คุณอาจใช้onCodeAutoRetrievalTimeOut
ขึ้นอยู่กับข้อกำหนดของแอปของคุณonVerificationCompleted (PhoneAuthCredential)
วิธีนี้เรียกว่าในสองสถานการณ์:
- การยืนยันทันที: ในบางกรณี หมายเลขโทรศัพท์สามารถตรวจสอบได้ทันทีโดยไม่ต้องส่งหรือป้อนรหัสยืนยัน
- การดึงข้อมูลอัตโนมัติ: ในบางอุปกรณ์ บริการ Google Play สามารถตรวจจับ SMS ยืนยันที่เข้ามาโดยอัตโนมัติและดำเนินการตรวจสอบโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ (ความสามารถนี้อาจไม่สามารถใช้ได้กับผู้ให้บริการบางราย) ซึ่งใช้ SMS Retriever API ซึ่งรวมถึงแฮช 11 อักขระที่ส่วนท้ายของข้อความ SMS
PhoneAuthCredential
ที่ส่งผ่านไปยังการโทรกลับเพื่อ ลงชื่อเข้าใช้ผู้ใช้onVerificationFailed (FirebaseException)
วิธีนี้เรียกว่าเพื่อตอบสนองต่อคำขอยืนยันที่ไม่ถูกต้อง เช่น คำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent (String verificationId, PhoneAuthProvider.ForceResendingToken)
ไม่จำเป็น. วิธีนี้เรียกว่าหลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ให้ไว้
เมื่อเรียกวิธีนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกัน การยืนยันอัตโนมัติอาจดำเนินการในเบื้องหลัง) จากนั้น หลังจากที่ผู้ใช้พิมพ์รหัสยืนยันแล้ว คุณสามารถใช้รหัสยืนยันและรหัสยืนยันที่ส่งผ่านไปยังวิธีการสร้างวัตถุ
PhoneAuthCredential
ซึ่ง คุณสามารถใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ อย่างไรก็ตาม แอพบางตัวอาจรอจนกว่าจะมีการเรียกonCodeAutoRetrievalTimeOut
ก่อนที่จะแสดง UI รหัสยืนยัน (ไม่แนะนำ)onCodeAutoRetrivalTimeOut(String VertifyId)
ไม่จำเป็น. วิธีการนี้ถูกเรียกหลังจากระยะเวลาหมดเวลาที่ระบุเพื่อ
verifyPhoneNumber
ผ่านไปแล้วโดยไม่มีการทริกเกอร์onVerificationCompleted
ก่อน บนอุปกรณ์ที่ไม่มีซิมการ์ด ระบบจะเรียกวิธีนี้ทันทีเนื่องจากไม่สามารถดึง SMS อัตโนมัติได้แอปบางแอปจะบล็อกการป้อนข้อมูลของผู้ใช้จนกว่าจะหมดเวลาการยืนยันอัตโนมัติ จากนั้นจึงแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS เท่านั้น (ไม่แนะนำ)
สร้างวัตถุ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้แล้ว ให้สร้างอ็อบเจ็กต์
PhoneAuthCredential
โดยใช้รหัสยืนยันและ ID การตรวจสอบที่ส่งผ่านไปยังการโทรกลับonCodeSent
หรือonCodeAutoRetrievalTimeOut
(เมื่อเรียกใช้onVerificationCompleted
คุณจะได้รับอ็อบเจ็กต์PhoneAuthCredential
โดยตรง ดังนั้นคุณจึงสามารถข้ามขั้นตอนนี้ได้)ในการสร้างอ็อบเจ็กต์
PhoneAuthCredential
ให้เรียกPhoneAuthProvider.getCredential
:Java
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
Kotlin+KTX
val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
เข้าสู่ระบบผู้ใช้
หลังจากที่คุณได้รับอ็อบเจ็กต์
PhoneAuthCredential
ไม่ว่าจะในการโทรกลับonVerificationCompleted
หรือโดยการเรียกPhoneAuthProvider.getCredential
ให้ทำตามขั้นตอนการลงชื่อเข้าใช้โดยส่งอ็อบเจ็กต์PhoneAuthCredential
ไปยังFirebaseAuth.signInWithCredential
: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 } } } }); }
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 } } }
ทดสอบด้วยหมายเลขโทรศัพท์สมมติ
คุณสามารถตั้งค่าหมายเลขโทรศัพท์สมมติสำหรับการพัฒนาผ่านคอนโซล Firebase การทดสอบด้วยหมายเลขโทรศัพท์สมมติให้ประโยชน์เหล่านี้:
- ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ใช้โควต้าการใช้งานของคุณ
- ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ต้องส่งข้อความ SMS จริง
- ทำการทดสอบต่อเนื่องด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่ถูกจำกัดปริมาณ ซึ่งจะช่วยลดความเสี่ยงที่จะถูกปฏิเสธระหว่างกระบวนการตรวจสอบ App Store หากผู้ตรวจสอบบังเอิญใช้หมายเลขโทรศัพท์เดียวกันสำหรับการทดสอบ
- ทดสอบได้อย่างง่ายดายในสภาพแวดล้อมการพัฒนาโดยไม่ต้องใช้ความพยายามเพิ่มเติม เช่น ความสามารถในการพัฒนาในโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องใช้ Google Play Services
- เขียนการทดสอบการรวมโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยซึ่งปกติแล้วจะใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมที่ใช้งานจริง
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้:
- ตรวจสอบให้แน่ใจว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นจริง และยังไม่มีอยู่จริง การตรวจสอบสิทธิ์ Firebase ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้หมายเลขนำหน้า 555 เป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา เช่น +1 650-555-3434
- หมายเลขโทรศัพท์ต้องอยู่ในรูปแบบที่ถูกต้องสำหรับความยาวและข้อจำกัดอื่นๆ พวกเขาจะยังคงผ่านการตรวจสอบเดียวกันกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณสามารถเพิ่มหมายเลขโทรศัพท์สำหรับการพัฒนาได้สูงสุด 10 หมายเลข
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่เดายากและเปลี่ยนบ่อย
สร้างหมายเลขโทรศัพท์สมมติและรหัสยืนยัน
- ใน คอนโซล Firebase ให้เปิดส่วนการ ตรวจสอบสิทธิ์
- ในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการโทรศัพท์ หากคุณยังไม่ได้ดำเนินการ
- เปิดเมนู หมายเลขโทรศัพท์สำหรับทดสอบ หีบเพลง
- ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบ เช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขดังกล่าว เช่น 654321
- เพิ่ม หมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในใบสมัครของคุณได้โดยตรง ซึ่งช่วยให้คุณทำการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาได้โดยไม่มีปัญหาเรื่องโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องติดตั้ง Google Play Services
เมื่อคุณให้หมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง คุณต้องระบุรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้เพื่อลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
เมื่อลงชื่อเข้าใช้เสร็จสมบูรณ์ ผู้ใช้ Firebase จะถูกสร้างขึ้นด้วยหมายเลขโทรศัพท์นั้น ผู้ใช้มีพฤติกรรมและคุณสมบัติเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึงฐานข้อมูลเรียลไทม์/Cloud Firestore และบริการอื่นๆ ในลักษณะเดียวกัน โทเค็น ID ที่สร้างขึ้นในระหว่างกระบวนการนี้มีลายเซ็นเดียวกันกับผู้ใช้หมายเลขโทรศัพท์จริง
อีกทางเลือกหนึ่งคือการ ตั้งค่าบทบาททดสอบผ่านการอ้างสิทธิ์ที่กำหนดเอง กับผู้ใช้เหล่านี้ เพื่อแยกความแตกต่างว่าเป็นผู้ใช้ปลอม หากคุณต้องการจำกัดการเข้าถึงเพิ่มเติม
หากต้องการทริกเกอร์โฟลว์ reCAPTCHA ด้วยตนเองสำหรับการทดสอบ ให้ใช้
forceRecaptchaFlowForTesting()
// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
การทดสอบบูรณาการ
นอกเหนือจากการทดสอบด้วยตนเองแล้ว การตรวจสอบสิทธิ์ของ Firebase ยังมี API เพื่อช่วยเขียนการทดสอบการผสานรวมสำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้ปิดใช้งานการตรวจสอบแอปโดยปิดใช้งานข้อกำหนด reCAPTCHA ในเว็บและการแจ้งเตือนแบบเงียบใน iOS สิ่งนี้ทำให้การทดสอบอัตโนมัติเป็นไปได้ในโฟลว์เหล่านี้และง่ายต่อการนำไปใช้ นอกจากนี้ยังช่วยให้สามารถทดสอบขั้นตอนการยืนยันทันทีบน Android
บน Android ให้เรียก
setAppVerificationDisabledForTesting()
ก่อนการเรียกsignInWithPhoneNumber
การดำเนินการนี้จะปิดใช้งานการตรวจสอบแอปโดยอัตโนมัติ ทำให้คุณสามารถส่งหมายเลขโทรศัพท์โดยไม่ต้องแก้ไขด้วยตนเอง โปรดทราบว่าแม้จะปิดใช้งาน reCAPTCHA และ/หรือ SafetyNet การใช้หมายเลขโทรศัพท์จริงจะยังคงลงชื่อเข้าใช้ไม่สำเร็จ เฉพาะหมายเลขโทรศัพท์สมมติเท่านั้นที่สามารถใช้กับ API นี้ได้// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
การโทร
verifyPhoneNumber
ด้วยหมายเลขสมมติจะเรียกการโทรกลับonCodeSent
ซึ่งคุณจะต้องระบุรหัสยืนยันที่เกี่ยวข้อง อนุญาตให้ทำการทดสอบใน Android EmulatorsJava
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(String verificationId, 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(PhoneAuthCredential phoneAuthCredential) { // Sign in with the credential // ... } @Override public void onVerificationFailed(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)
นอกจากนี้ คุณสามารถทดสอบโฟลว์การดึงข้อมูลอัตโนมัติใน Android โดยการตั้งค่าหมายเลขสมมติและรหัสยืนยันที่เกี่ยวข้องสำหรับการดึงข้อมูลอัตโนมัติโดยเรียก
setAutoRetrievedSmsCodeForPhoneNumber
เมื่อมีการเรียก
verifyPhoneNumber
มันจะทริกเกอร์onVerificationCompleted
ด้วยPhoneAuthCredential
โดยตรง ใช้งานได้กับหมายเลขโทรศัพท์สมมติเท่านั้นตรวจสอบให้แน่ใจว่าสิ่งนี้ถูกปิดใช้งานและไม่มีการฮาร์ดโค้ดหมายเลขโทรศัพท์ที่สมมติขึ้นในแอปของคุณเมื่อเผยแพร่แอปพลิเคชันของคุณไปยัง Google Play Store
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(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)
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก บัญชีผู้ใช้ใหม่จะถูกสร้างขึ้นและเชื่อมโยงกับข้อมูลประจำตัว กล่าวคือ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ ซึ่งผู้ใช้ลงชื่อเข้าใช้ บัญชีใหม่นี้จัดเก็บเป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ของคุณ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
ในแอปของคุณ คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้จากอ็อบเจ็กต์
FirebaseUser
ดู จัดการผู้ใช้ในฐานข้อมูล Firebase Realtime Database และ Cloud Storage Security Rules คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย เชื่อมโยงข้อมูลรับรองของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการออกจากระบบผู้ใช้ ให้โทร
signOut
:Java
FirebaseAuth.getInstance().signOut();
Kotlin+KTX
Firebase.auth.signOut()
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2022-08-17 UTC.
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"ไม่มีข้อมูลที่ฉันต้องการ" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป" },{ "type": "thumb-down", "id": "outOfDate", "label":"ล้าสมัย" },{ "type": "thumb-down", "id": "translationIssue", "label":"ปัญหาเกี่ยวกับการแปล" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด" },{ "type": "thumb-down", "id": "otherDown", "label":"อื่นๆ" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"เข้าใจง่าย" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"แก้ปัญหาของฉันได้" },{ "type": "thumb-up", "id": "otherUp", "label":"อื่นๆ" }]