คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ให้ผู้ใช้ได้โดยส่งข้อความ SMS ลงในโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่มีอยู่ใน ข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปคือการใช้ FirebaseUI ซึ่งรวมถึงวิดเจ็ตการลงชื่อเข้าใช้ที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับโทรศัพท์ การลงชื่อเข้าใช้ด้วยหมายเลข รวมถึงการลงชื่อเข้าใช้ด้วยรหัสผ่านและแบบรวมศูนย์ เอกสารนี้ อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ด้วย Firebase SDK
ก่อนเริ่มต้น
- หากคุณยังไม่ได้ดำเนินการ เพิ่ม Firebase ลงในโปรเจ็กต์ Android
-
ในไฟล์ Gradle ของโมดูล (ระดับแอป)
(ปกติ
<project>/<app-module>/build.gradle.kts
หรือ<project>/<app-module>/build.gradle
) เพิ่มทรัพยากร Dependency สำหรับไลบรารี Firebase Authentication สำหรับ Android เราขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมการกำหนดเวอร์ชันไลบรารีdependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.2.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") }
เมื่อใช้Firebase Android BoM แอปจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ
(ทางเลือก) เพิ่มทรัพยากร Dependency ของไลบรารี Firebase โดยไม่ใช้ BoM
หากเลือกไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชัน ในบรรทัดทรัพยากร Dependency
โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลายรายการในแอป เราขอแนะนำอย่างยิ่ง แนะนำให้ใช้ BoM ในการจัดการเวอร์ชันไลบรารี เพื่อให้มั่นใจว่าทุกเวอร์ชัน ที่เข้ากันได้
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth:23.0.0") }
- หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก คอนโซล Firebase
- หากคุณยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปในคอนโซล Firebase ให้ทำดังนี้ แบบนั้น ดู การตรวจสอบสิทธิ์ไคลเอ็นต์เพื่อดูข้อมูลเกี่ยวกับการค้นหา SHA-1 ของแอป แฮช
ข้อกังวลด้านความปลอดภัย
การตรวจสอบสิทธิ์โดยใช้เพียงหมายเลขโทรศัพท์มีความปลอดภัยน้อยกว่า วิธีการอื่นๆ ที่มีอยู่ เพราะการมีหมายเลขโทรศัพท์ สามารถถ่ายโอนระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ ในอุปกรณ์ที่มีผู้ใช้หลายคน ผู้ใช้ที่สามารถรับข้อความ SMS จะสามารถลงชื่อเข้าใช้บัญชีโดยใช้ หมายเลขโทรศัพท์ของอุปกรณ์
หากใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอป คุณควรเสนอ ควบคู่กับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยยิ่งขึ้น และแจ้งให้ผู้ใช้ทราบเกี่ยวกับความปลอดภัย ข้อดีข้อเสียของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้การลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase
หากต้องการลงชื่อเข้าใช้ให้ผู้ใช้ทาง SMS คุณต้องเปิดใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ก่อน สำหรับโปรเจ็กต์ Firebase ของคุณ
- ในคอนโซล Firebase ให้เปิดส่วนการตรวจสอบสิทธิ์
- ในหน้าวิธีการลงชื่อเข้าใช้ ให้เปิดใช้หมายเลขโทรศัพท์ วิธีลงชื่อเข้าใช้
เปิดใช้การตรวจสอบแอป
หากต้องการใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ Firebase ต้องสามารถยืนยันว่า คำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์มาจากแอปของคุณ มีอยู่ 3 วิธีด้วยกัน Firebase Authentication บรรลุเป้าหมายนี้:
- Play Integrity API: หากผู้ใช้มีอุปกรณ์ที่ติดตั้ง Google Play services ไว้
และ Firebase Authentication สามารถยืนยันว่าอุปกรณ์ถูกต้องด้วย
Play Integrity API
การลงชื่อเข้าใช้หมายเลขโทรศัพท์จะสามารถดำเนินการต่อ เปิดใช้ Play Integrity API ในโปรเจ็กต์ที่ Google เป็นเจ้าของโดย
Firebase Authentication ไม่อยู่ในโปรเจ็กต์ของคุณ ข้อมูลนี้ไม่มีผลต่อ Play Integrity API
โควต้าสำหรับโครงการของคุณ การสนับสนุนด้านความสมบูรณ์ของ Play พร้อมให้บริการด้วย
Authentication SDK เวอร์ชัน 21.2.0 ขึ้นไป
(Firebase BoM v31.4.0 ขึ้นไป)
หากต้องการใช้ Play Integrity หากยังไม่ได้ระบุลายนิ้วมือ SHA-256 ของแอป ให้ระบุ จาก โครงการ การตั้งค่าของคอนโซล Firebase โปรดดู การตรวจสอบสิทธิ์ ไคลเอ็นต์เพื่อดูรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA-256 ของแอป
- การยืนยันด้วย reCAPTCHA: ในกรณีที่ใช้ Play Integrity ไม่ได้
เช่น เมื่อผู้ใช้มีอุปกรณ์ไม่ได้ติดตั้ง Google Play services Firebase Authentication
ใช้การยืนยัน reCAPTCHA เพื่อทำตามขั้นตอนการลงชื่อเข้าใช้ทางโทรศัพท์ให้เสร็จสมบูรณ์ ภาพทดสอบ reCAPTCHA
มักจะเสร็จสมบูรณ์โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย โปรดทราบว่าขั้นตอนนี้กำหนดให้
SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ ขั้นตอนนี้กําหนดให้คีย์ API ของคุณ
ไม่จำกัดหรืออยู่ในรายการที่อนุญาตสำหรับ
PROJECT_ID.firebaseapp.com
ตัวอย่างสถานการณ์ที่ทริกเกอร์ reCAPTCHA มีดังนี้
- หากอุปกรณ์ของผู้ใช้ปลายทางไม่ได้ติดตั้ง Google Play services
- หากไม่ได้เผยแพร่แอปผ่าน Google Play Store (ใน Authentication SDK v21.2.0+)
- หากโทเค็น SafetyNet ที่ได้รับมาไม่ถูกต้อง (ใน SDK ของ Authentication เวอร์ชัน < v21.2.0)
เมื่อใช้ SafetyNet หรือ Play Integrity สำหรับการยืนยันแอป ช่อง
%APP_NAME%
ในเทมเพลต SMS จะมีชื่อแอปที่ระบุจาก Google Play Store ในกรณีที่มีการทริกเกอร์ reCAPTCHA ระบบจะป้อนข้อมูล%APP_NAME%
เป็นPROJECT_ID.firebaseapp.com
forceRecaptchaFlowForTesting
คุณสามารถปิดใช้การยืนยันแอป (เมื่อใช้หมายเลขโทรศัพท์สมมติ) ได้โดยใช้
setAppVerificationDisabledForTesting
การแก้ปัญหา
"ไม่มีสถานะเริ่มต้น" ข้อผิดพลาดเมื่อใช้ reCAPTCHA สําหรับการยืนยันแอป
ซึ่งอาจเกิดขึ้นเมื่อขั้นตอน reCAPTCHA เสร็จสมบูรณ์ แต่จะไม่เปลี่ยนเส้นทางผู้ใช้กลับไปยังแอปพลิเคชันของระบบ ในกรณีนี้ ระบบจะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL สำรอง
PROJECT_ID.firebaseapp.com/__/auth/handler
ในเบราว์เซอร์ Firefox การเปิดลิงก์แอปที่มาพร้อมเครื่องจะถูกปิดใช้งานโดยค่าเริ่มต้น หากคุณเห็นข้อผิดพลาดข้างต้นใน Firefox ให้ทำตามขั้นตอนในตั้งค่า Firefox สำหรับ Android ให้เปิดลิงก์ในแอปที่มาพร้อมเครื่องเพื่อเปิดใช้การเปิดลิงก์ของแอป
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มลงชื่อเข้าใช้หมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งแก่ผู้ใช้ เพื่อพิมพ์หมายเลขโทรศัพท์ ข้อกำหนดทางกฎหมายอาจแตกต่างกันไป แต่แนวทางปฏิบัติแนะนำคือ และเพื่อกำหนดความคาดหวังให้กับผู้ใช้ คุณควรแจ้งให้ผู้ใช้ทราบว่าถ้าพวกเขาใช้ ลงชื่อเข้าใช้ทางโทรศัพท์ ผู้ใช้อาจได้รับข้อความ SMS สำหรับการยืนยันและ มีค่าบริการ
จากนั้นส่งหมายเลขโทรศัพท์ของลูกค้าไปยัง
PhoneAuthProvider.verifyPhoneNumber
วิธีในการขอให้ Firebase
ยืนยันหมายเลขโทรศัพท์ของผู้ใช้ เช่น
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);
เมธอด verifyPhoneNumber
เป็นแอปใหม่ นั่นคือ หากคุณเรียกว่า
หลายครั้ง เช่น ในเมธอด onStart
ของกิจกรรม ค่า
เมธอด verifyPhoneNumber
จะไม่ส่ง SMS ครั้งที่ 2 เว้นแต่
คำขอเดิมหมดเวลาแล้ว
คุณสามารถใช้ลักษณะการทำงานนี้เพื่อดำเนินการลงชื่อเข้าใช้หมายเลขโทรศัพท์ต่อได้ หาก
ปิดแอปก่อนที่ผู้ใช้จะลงชื่อเข้าใช้ได้ (เช่น ขณะที่ผู้ใช้กำลังใช้
แอป SMS ของพวกเขา) หลังจากโทรหา verifyPhoneNumber
ให้ติดธงว่า
แสดงว่าอยู่ระหว่างการยืนยัน จากนั้นบันทึกการทำเครื่องหมายใน "กิจกรรม"
onSaveInstanceState
และคืนค่าสถานะใน
onRestoreInstanceState
สุดท้าย ใน "กิจกรรม"
onStart
ให้ตรวจสอบว่าการยืนยันอยู่ระหว่างดำเนินการหรือไม่ และ
หากเป็นเช่นนั้น โปรดโทรหา verifyPhoneNumber
อีกครั้ง อย่าลืมล้างธงเมื่อ
การยืนยันเสร็จสมบูรณ์หรือล้มเหลว (โปรดดู
การยืนยันทางโทรศัพท์)
เพื่อให้จัดการกับการหมุนหน้าจอและอินสแตนซ์อื่นๆ ของการรีสตาร์ทกิจกรรมได้อย่างง่ายดาย
ส่งกิจกรรมของคุณไปยังเมธอด verifyPhoneNumber
Callback
จะถอดออกโดยอัตโนมัติเมื่อกิจกรรมหยุด เพื่อให้คุณสามารถเขียน UI ได้อย่างอิสระ
ในเมธอด Callback
ข้อความ SMS ที่ส่งโดย Firebase ยังสามารถแปลได้โดยระบุ
การตรวจสอบสิทธิ์ภาษาผ่านเมธอด setLanguageCode
ในการตรวจสอบสิทธิ์ของคุณ
อินสแตนซ์
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();
เมื่อโทรหา PhoneAuthProvider.verifyPhoneNumber
คุณต้อง
มีอินสแตนซ์ OnVerificationStateChangedCallbacks
ซึ่ง
มีการใช้งานฟังก์ชัน Callback ที่จัดการผลลัพธ์ของ
คำขอ เช่น
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; } };
การติดต่อกลับสำหรับการยืนยัน
ในแอปส่วนใหญ่ คุณจะใช้ onVerificationCompleted
onVerificationFailed
และ onCodeSent
Callback คุณ
อาจใช้ onCodeAutoRetrievalTimeOut
ได้เช่นกัน ทั้งนี้ขึ้นอยู่กับ
ข้อกำหนดของแอป
onการยืนยันเสร็จสมบูรณ์(PhoneAuthCredential)
วิธีการนี้จะเรียกใช้ใน 2 กรณีดังนี้
- การยืนยันทันที: ในบางกรณี หมายเลขโทรศัพท์อาจทำได้ในทันที ได้รับการยืนยันโดยไม่ต้องส่งหรือป้อนรหัสยืนยัน
- เรียกอัตโนมัติ: ในอุปกรณ์บางรุ่น บริการ Google Play สามารถ ตรวจสอบ SMS ยืนยันขาเข้าโดยอัตโนมัติและดำเนินการ การยืนยันโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ (ความสามารถนี้อาจไม่พร้อมใช้งาน กับผู้ให้บริการบางราย) การทำงานนี้ใช้ SMS Retriever API ประกอบด้วยแฮช 11 อักขระที่ท้ายข้อความ SMS
PhoneAuthCredential
ที่ส่งไปยัง
Callback เพื่อลงชื่อเข้าใช้ผู้ใช้
onการยืนยันล้มเหลว(FirebaseException)
มีการเรียกใช้วิธีนี้ตามคำขอการยืนยันที่ไม่ถูกต้อง เช่น เป็นคำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent(String VerificationId, PhoneAuthProvider.ForceปลอดภัยingToken)
ไม่บังคับ ระบบจะเรียกวิธีการนี้หลังจากส่งรหัสยืนยันแล้ว ทาง SMS ไปยังหมายเลขโทรศัพท์ที่ระบุไว้
เมื่อมีการเรียกใช้วิธีการนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งผู้ใช้
เพื่อพิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกัน
การยืนยันอัตโนมัติอาจดำเนินการอยู่เบื้องหลัง) จากนั้นหลังจากที่ผู้ใช้
พิมพ์รหัสยืนยัน คุณสามารถใช้รหัสยืนยันและ
รหัสการยืนยันที่ส่งไปยังวิธีการสร้าง
PhoneAuthCredential
ออบเจ็กต์ซึ่งคุณจะนำไปใช้เพื่อลงชื่อเข้าใช้ได้
ผู้ใช้รายนั้น แต่บางแอปอาจรอจนกว่า
มีการเรียก onCodeAutoRetrievalTimeOut
ก่อนแสดง
UI รหัสยืนยัน (ไม่แนะนำ)
onCodeAutoRetrievalTimeOut(สตริงการยืนยันรหัส)
ไม่บังคับ ระบบจะเรียกเมธอดนี้หลังจากระยะหมดเวลาที่ระบุไว้
verifyPhoneNumber
ได้ผ่านไปแล้วโดยไม่มี
onVerificationCompleted
ทริกเกอร์ก่อน ในอุปกรณ์ที่ไม่มีซิม
ระบบจะเรียกวิธีการนี้ทันที เนื่องจากการเรียกข้อความอัตโนมัติผ่าน SMS
เท่าที่จะเป็นไปได้
แอปบางแอปบล็อกข้อมูลจากผู้ใช้จนกว่าระยะเวลาการยืนยันอัตโนมัติจะหมดลง จากนั้นจะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันเท่านั้น จากข้อความ SMS (ไม่แนะนำ)
สร้างออบเจ็กต์ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปให้ผู้ใช้
สร้างออบเจ็กต์ PhoneAuthCredential
โดยใช้การยืนยันในโทรศัพท์
และรหัสยืนยันที่ส่งไปยัง onCodeSent
หรือ
onCodeAutoRetrievalTimeOut
Callback (เมื่อ
โทรหา onVerificationCompleted
แล้ว คุณจะได้รับ
PhoneAuthCredential
โดยตรงเพื่อให้ข้ามขั้นตอนนี้ได้)
หากต้องการสร้างออบเจ็กต์ PhoneAuthCredential
โปรดเรียก
PhoneAuthProvider.getCredential
:
Kotlin+KTX
val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
Java
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
ลงชื่อเข้าใช้ผู้ใช้
หลังจากได้รับออบเจ็กต์ PhoneAuthCredential
ไม่ว่าจะเป็นใน
onVerificationCompleted
ขอให้โทรกลับหรือด้วยการโทร
PhoneAuthProvider.getCredential
ดำเนินการขั้นตอนการลงชื่อเข้าใช้ให้เสร็จสิ้นโดย
กำลังส่งออบเจ็กต์ PhoneAuthCredential
ไปยัง
FirebaseAuth.signInWithCredential
:
Kotlin+KTX
private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) { auth.signInWithCredential(credential) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithCredential:success") val user = task.result?.user } else { // Sign in failed, display a message and update the UI Log.w(TAG, "signInWithCredential:failure", task.exception) if (task.exception is FirebaseAuthInvalidCredentialsException) { // The verification code entered was invalid } // Update UI } } }
Java
private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) { mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithCredential:success"); FirebaseUser user = task.getResult().getUser(); // Update UI } else { // Sign in failed, display a message and update the UI Log.w(TAG, "signInWithCredential:failure", task.getException()); if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) { // The verification code entered was invalid } } } }); }
ทดสอบด้วยหมายเลขโทรศัพท์สมมติ
คุณตั้งค่าหมายเลขโทรศัพท์สมมติสำหรับการพัฒนาได้ผ่านคอนโซล Firebase การทดสอบด้วยโทรศัพท์สมมติ ตัวเลขมีประโยชน์ดังนี้
- ทดสอบการตรวจสอบสิทธิ์ของหมายเลขโทรศัพท์โดยไม่ใช้โควต้าการใช้งาน
- ทดสอบการตรวจสอบสิทธิ์หมายเลขโทรศัพท์โดยไม่ส่งข้อความ SMS จริง
- ทำการทดสอบติดต่อกันด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่มีการควบคุม ช่วงเวลานี้ ลดความเสี่ยงในการปฏิเสธระหว่างกระบวนการตรวจสอบของ App Store หากผู้ตรวจสอบใช้งาน หมายเลขเดียวกันสำหรับการทดสอบ
- ทดสอบได้ทันทีในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม เช่น สามารถพัฒนาโดยใช้โปรแกรมจำลอง iOS หรือโปรแกรมจำลองของ Android โดยไม่ใช้บริการ Google Play
- เขียนการทดสอบการผสานรวมโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยที่ใช้ตามปกติ จากหมายเลขโทรศัพท์จริงในสภาพแวดล้อมการใช้งานจริง
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้
- ตรวจสอบว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นจริงๆ และหมายเลขไม่มีอยู่จริง Firebase Authentication ไม่อนุญาตให้คุณกำหนดหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือการใช้หมายเลข 555 นำหน้าเป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา ตัวอย่างเช่น +6650-555-3434
- หมายเลขโทรศัพท์ต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและหมายเลขอื่นๆ ข้อจำกัด ผู้ใช้จะยังผ่านขั้นตอนการตรวจสอบเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณเพิ่มหมายเลขโทรศัพท์สำหรับการพัฒนาได้สูงสุด 10 หมายเลข
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่คาดเดาและเปลี่ยนแปลงได้ยาก เหล่านั้นบ่อยๆ
สร้างหมายเลขโทรศัพท์และรหัสยืนยันสมมติ
- ในคอนโซล Firebase ให้เปิด การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการโทรศัพท์หากยังไม่ได้เปิดใช้
- เปิดเมนูหมายเลขโทรศัพท์สำหรับการทดสอบ
- ระบุหมายเลขโทรศัพท์ที่ต้องการทดสอบ เช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักของหมายเลขนั้น เช่น 654321
- เพิ่มหมายเลข หากมีความจำเป็น คุณสามารถลบหมายเลขโทรศัพท์นั้นแล้ว โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันได้โดยตรง วิธีนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้ ทำการทดสอบด้วยตนเองระหว่างขั้นตอนการพัฒนาโดยไม่พบปัญหาด้านโควต้าหรือการควบคุม คุณยังทดสอบจากเครื่องจำลอง iOS หรือโปรแกรมจำลองของ Android ได้โดยตรงโดยไม่ต้องใช้บริการ Google Play ติดตั้งไว้แล้ว
เมื่อคุณระบุหมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง ที่คุณส่งไป แต่คุณต้องป้อนรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้แทนเพื่อให้การลงนามเสร็จสมบูรณ์ นิ้ว
เมื่อลงชื่อเข้าใช้เสร็จแล้ว ระบบจะสร้างผู้ใช้ Firebase ด้วยหมายเลขโทรศัพท์ดังกล่าว ผู้ใช้มีพฤติกรรมและพร็อพเพอร์ตี้เหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึง Realtime Database/Cloud Firestore และบริการอื่นๆ ในลักษณะเดียวกัน โทเค็นรหัสที่สร้างในระหว่าง กระบวนการนี้จะมีลายเซ็นเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง
อีกตัวเลือกหนึ่งคือ กำหนดบทบาททดสอบผ่านที่กำหนดเอง การอ้างสิทธิ์กับผู้ใช้เหล่านี้เพื่อแบ่งแยกว่าเป็นผู้ใช้ปลอม หากคุณต้องการจำกัดยิ่งขึ้น สิทธิ์การเข้าถึง
หากต้องการทริกเกอร์ขั้นตอน reCAPTCHA สำหรับการทดสอบด้วยตนเอง ให้ใช้
forceRecaptchaFlowForTesting()
วิธี
// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
การทดสอบการผสานรวม
นอกจากการทดสอบด้วยตนเองแล้ว Firebase Authentication ยังมี API เพื่อช่วยเขียนการทดสอบการผสานรวม สำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้จะปิดใช้การตรวจสอบแอปโดยการปิดใช้ reCAPTCHA ข้อกำหนดบนเว็บและข้อความ Push แบบปิดเสียงใน iOS จึงทําให้สามารถทดสอบการทำงานอัตโนมัติได้ใน ดำเนินการตามขั้นตอนเหล่านี้ได้ และปรับใช้ง่ายขึ้น นอกจากนี้ยังช่วยให้สามารถทดสอบ ขั้นตอนการยืนยันบน Android
ใน Android ให้โทรหา setAppVerificationDisabledForTesting()
ก่อน
โทร signInWithPhoneNumber
การดำเนินการนี้จะปิดใช้การตรวจสอบแอปโดยอัตโนมัติ
ทำให้คุณสามารถส่งหมายเลขโทรศัพท์ได้โดยไม่ต้องแก้ปัญหาด้วยตนเอง แม้ว่า
ระบบปิดใช้ Play Integrity และ reCAPTCHA หากใช้หมายเลขโทรศัพท์จริงไม่สำเร็จ
ลงชื่อเข้าใช้ให้เสร็จสิ้น ใช้ได้เฉพาะหมายเลขโทรศัพท์สมมติเท่านั้นกับ API นี้
// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
การเรียกใช้ verifyPhoneNumber
ด้วยหมายเลขสมมติจะทริกเกอร์
onCodeSent
ซึ่งคุณจะต้องทำการยืนยันที่เกี่ยวข้อง
โค้ด การดำเนินการนี้ช่วยให้ทดสอบใน Android Emulator ได้
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)
นอกจากนี้ คุณสามารถทดสอบขั้นตอนการเรียกข้อมูลอัตโนมัติใน 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(@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)
ขั้นตอนถัดไป
หลังจากผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่ และ ซึ่งก็คือชื่อผู้ใช้และรหัสผ่าน โทรศัพท์ หมายเลข หรือข้อมูลของผู้ให้บริการตรวจสอบสิทธิ์ ซึ่งก็คือผู้ใช้ที่ลงชื่อเข้าใช้ ใหม่นี้ จัดเก็บเป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุ ผู้ใช้สำหรับทุกแอปในโปรเจ็กต์ของคุณ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
-
ในแอป คุณสามารถดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จาก
FirebaseUser
โปรดดู จัดการผู้ใช้ ในFirebase Realtime DatabaseและCloud Storage กฎความปลอดภัย คุณสามารถทำสิ่งต่อไปนี้ รับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้การตรวจสอบสิทธิ์หลายรายการได้ โดยลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการการตรวจสอบสิทธิ์กับ บัญชีผู้ใช้ที่มีอยู่เดิม
หากต้องการนำผู้ใช้ออกจากระบบ โปรดโทร
signOut
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();