คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้โดยใช้รหัสแบบใช้ครั้งเดียวที่มีอยู่ในข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้หมายเลขโทรศัพท์ในแอปของคุณคือการใช้ FirebaseUI ซึ่งรวมถึงวิดเจ็ตการลงชื่อเข้าใช้แบบดรอปอินที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับการลงชื่อเข้าใช้หมายเลขโทรศัพท์ตลอดจนการลงชื่อเข้าใช้ด้วยรหัสผ่านและแบบรวมศูนย์ -ใน. เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนที่คุณจะเริ่ม
- เพิ่ม Firebase ในโปรเจ็กต์ Android ของคุณ หากยังไม่ได้ ทำ
- ใช้ Firebase Android BoM ประกาศการอ้างอิงสำหรับไลบรารี Android ของ Firebase Authentication ใน โมดูล ของคุณ (ระดับแอป) ไฟล์ Gradle (โดยทั่วไปคือ
app/build.gradle
)Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:26.6.0') // 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:20.0.3' }
โคตรลิน + KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:26.6.0') // 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:20.0.3' }
- หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ 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 สำหรับโครงการของคุณ จะใช้คีย์ API เริ่มต้นของ Firebase และต้องได้รับอนุญาตให้เข้าถึง DeviceCheck API
- หากคุณยังไม่ได้ระบุลายนิ้วมือ SHA-256 ของแอปให้ทำได้จาก หน้าการตั้งค่า ของคอนโซล Firebase อ้างอิงถึงการ พิสูจน์ตัวตนลูกค้าของคุณ สำหรับรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA-256 ของแอปของคุณ
- การตรวจสอบ reCAPTCHA : ในกรณีที่ไม่สามารถใช้ SafetyNet ได้เช่นเมื่อผู้ใช้ไม่มีการสนับสนุนบริการ Google Play หรือเมื่อทดสอบแอปของคุณบนโปรแกรมจำลองการตรวจสอบสิทธิ์ Firebase จะใช้การยืนยัน reCAPTCHA เพื่อดำเนินขั้นตอนการลงชื่อเข้าใช้โทรศัพท์ให้เสร็จสมบูรณ์ ความท้าทาย reCAPTCHA มักจะสำเร็จได้โดยที่ผู้ใช้ไม่ต้องแก้อะไรเลย โปรดทราบว่าขั้นตอนนี้กำหนดให้ SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ
ในการเปิดใช้ SafetyNet เพื่อใช้กับ Firebase Authentication:
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
ในการเริ่มการลงชื่อเข้าใช้หมายเลขโทรศัพท์ให้แสดงอินเทอร์เฟซแก่ผู้ใช้ที่แจ้งให้พิมพ์หมายเลขโทรศัพท์ ข้อกำหนดทางกฎหมายแตกต่างกันไป แต่ตามแนวทางปฏิบัติที่ดีที่สุดและเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ของคุณคุณควรแจ้งให้พวกเขาทราบว่าหากพวกเขาใช้การลงชื่อเข้าใช้ทางโทรศัพท์พวกเขาอาจได้รับข้อความ 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);
โคตรลิน + 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
เมธอดonSaveInstanceState
ของกิจกรรมของคุณและกู้คืนแฟonRestoreInstanceState
ใน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();
โคตรลิน + 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; // ... } };
โคตรลิน + 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 ยืนยันขาเข้าโดยอัตโนมัติและดำเนินการยืนยันโดยไม่ต้องดำเนินการใด ๆ โดยผู้ใช้ (ความสามารถนี้อาจใช้ไม่ได้กับผู้ให้บริการบางราย)
PhoneAuthCredential
ที่ส่งผ่านไปยังการโทรกลับเพื่อ ลงชื่อเข้าใช้ผู้ใช้onVerificationFailed (FirebaseException)
วิธีนี้เรียกว่าเพื่อตอบสนองต่อคำขอการยืนยันที่ไม่ถูกต้องเช่นคำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent (การตรวจสอบสตริง, PhoneAuthProviderForceResendingToken)
ไม่จำเป็น. วิธีนี้เรียกว่าหลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ให้ไว้
เมื่อเรียกวิธีนี้แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกันการยืนยันอัตโนมัติอาจดำเนินการอยู่เบื้องหลัง) จากนั้นหลังจากผู้ใช้พิมพ์รหัสยืนยันคุณสามารถใช้รหัสยืนยันและรหัสยืนยันที่ส่งไปยังเมธอดเพื่อสร้างวัตถุ
PhoneAuthCredential
ซึ่ง คุณสามารถใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ได้ อย่างไรก็ตามแอพบางตัวอาจรอจนกว่าจะมีการเรียกonCodeAutoRetrievalTimeOut
ก่อนที่จะแสดง UI ของรหัสยืนยัน (ไม่แนะนำ)onCodeAutoRetrievalTimeOut (String VerificationId)
ไม่จำเป็น. วิธีนี้เรียกว่าหลังจากระยะหมดเวลาที่ระบุเพื่อ
verifyPhoneNumber
ได้ผ่านไปโดยไม่มีการonVerificationCompleted
ริกเกอร์onVerificationCompleted
ก่อน ในอุปกรณ์ที่ไม่มีซิมการ์ดจะเรียกวิธีนี้ทันทีเนื่องจากไม่สามารถเรียก SMS อัตโนมัติได้แอพบางตัวบล็อกการป้อนข้อมูลของผู้ใช้จนกว่าระยะเวลาการยืนยันอัตโนมัติจะหมดลงจากนั้นจะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS เท่านั้น (ไม่แนะนำ)
สร้างวัตถุ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้สร้าง
PhoneAuthCredential
วัตถุโดยใช้รหัสยืนยันและรหัสยืนยันที่ถูกส่งผ่านไปยังonCodeSent
หรือonCodeAutoRetrievalTimeOut
โทรกลับ (เมื่อเรียกonVerificationCompleted
คุณจะได้รับวัตถุPhoneAuthCredential
โดยตรงดังนั้นคุณสามารถข้ามขั้นตอนนี้ไปได้)ในการสร้างวัตถุ
PhoneAuthCredential
ให้เรียกPhoneAuthProvider.getCredential
:Java
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
โคตรลิน + 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(); // ... } 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 } } } }); }
โคตรลิน + 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 } } } }
ทดสอบด้วยหมายเลขโทรศัพท์สมมติ
คุณสามารถตั้งค่าหมายเลขโทรศัพท์สมมติสำหรับการพัฒนาผ่านคอนโซล Firebase การทดสอบด้วยหมายเลขโทรศัพท์สมมติให้ประโยชน์เหล่านี้:
- ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ต้องใช้โควต้าการใช้งานของคุณ
- ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ต้องส่งข้อความ SMS จริง
- ทำการทดสอบติดต่อกันด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่ถูกควบคุม ซึ่งจะช่วยลดความเสี่ยงของการถูกปฏิเสธในระหว่างขั้นตอนการตรวจสอบ App Store หากผู้ตรวจสอบใช้หมายเลขโทรศัพท์เดียวกันในการทดสอบ
- ทดสอบได้ทันทีในสภาพแวดล้อมการพัฒนาโดยไม่ต้องใช้ความพยายามเพิ่มเติมเช่นความสามารถในการพัฒนาในโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องใช้บริการ Google Play
- เขียนการทดสอบการผสานรวมโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยโดยปกติจะใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมการใช้งานจริง
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้:
- ตรวจสอบให้แน่ใจว่าคุณใช้หมายเลขโทรศัพท์ที่เป็นเรื่องสมมติและไม่มีอยู่จริง การตรวจสอบสิทธิ์ Firebase ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้ 555 หมายเลขนำหน้าเป็นหมายเลขโทรศัพท์ทดสอบของสหรัฐอเมริกาเช่น +1 650-555-3434
- หมายเลขโทรศัพท์จะต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและข้อ จำกัด อื่น ๆ พวกเขาจะยังคงผ่านการตรวจสอบความถูกต้องเช่นเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณสามารถเพิ่มหมายเลขโทรศัพท์ได้ถึง 10 หมายเลขสำหรับการพัฒนา
- ใช้หมายเลขโทรศัพท์ / รหัสทดสอบที่คาดเดาได้ยากและเปลี่ยนแปลงบ่อยครั้ง
สร้างหมายเลขโทรศัพท์สมมติและรหัสยืนยัน
- ใน คอนโซล Firebase เปิดส่วนการ ตรวจสอบสิทธิ์
- ในแท็บ วิธีการลงชื่อเข้า ใช้ให้เปิดใช้งานผู้ให้บริการโทรศัพท์หากคุณยังไม่ได้ดำเนินการ
- เปิด หมายเลขโทรศัพท์เพื่อทดสอบ เมนูหีบเพลง
- ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบเช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขนั้น ๆ เช่น 654321
- เพิ่ม หมายเลข หากมีความจำเป็นคุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันของคุณได้โดยตรง วิธีนี้ช่วยให้คุณทำการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาโดยไม่พบปัญหาโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องติดตั้งบริการ Google Play
เมื่อคุณระบุหมายเลขโทรศัพท์สมมติและส่งรหัสยืนยันจะไม่มีการส่ง SMS จริง แต่คุณต้องระบุรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้เพื่อทำการลงชื่อเข้าใช้ให้เสร็จสิ้น
เมื่อลงชื่อเข้าใช้เสร็จสิ้นระบบจะสร้างผู้ใช้ Firebase ด้วยหมายเลขโทรศัพท์นั้น ผู้ใช้มีพฤติกรรมและคุณสมบัติเช่นเดียวกับผู้ใช้หมายเลขโทรศัพท์จริงและสามารถเข้าถึง Realtime Database / Cloud Firestore และบริการอื่น ๆ ได้ในลักษณะเดียวกัน โทเค็น ID ที่สร้างขึ้นในระหว่างขั้นตอนนี้มีลายเซ็นเดียวกับผู้ใช้หมายเลขโทรศัพท์จริง
อีกทางเลือกหนึ่งคือ ตั้งค่าบทบาททดสอบผ่านการอ้างสิทธิ์ที่กำหนดเอง กับผู้ใช้เหล่านี้เพื่อแยกความแตกต่างว่าเป็นผู้ใช้ปลอมหากคุณต้องการ จำกัด การเข้าถึงเพิ่มเติม
หากต้องการทริกเกอร์โฟลว์ reCAPTCHA ด้วยตนเองสำหรับการทดสอบให้ใช้
forceRecaptchaFlowForTesting()
// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
การทดสอบการผสานรวม
นอกเหนือจากการทดสอบด้วยตนเองแล้ว Firebase Authentication ยังมี 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);
โคตรลิน + 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);
โคตรลิน + 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 และ กฎความปลอดภัยของ Cloud Storage คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการการตรวจสอบสิทธิ์หลายรายโดยการ เชื่อมโยงข้อมูลรับรองของผู้ให้บริการรับรองความถูกต้องกับบัญชีผู้ใช้ที่มีอยู่
ในการออกจากระบบผู้ใช้โทร
signOut
:Java
FirebaseAuth.getInstance().signOut();
โคตรลิน + 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 2020-12-16 UTC.