คุณสามารถใช้ 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: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") }
การใช้ 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:25.0.0") }
- หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจากคอนโซล Firebase
- หากยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปในคอนโซล Firebase ให้ดำเนินการดังกล่าว ดูข้อมูลเกี่ยวกับการค้นหาแฮช SHA-1 ของแอปได้ที่ การตรวจสอบสิทธิ์ไคลเอ็นต์
ข้อกังวลด้านความปลอดภัย
การตรวจสอบสิทธิ์โดยใช้เพียงหมายเลขโทรศัพท์นั้นสะดวก แต่มีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มีอยู่ เนื่องจากผู้ใช้สามารถโอนการเป็นเจ้าของหมายเลขโทรศัพท์ให้กันได้ง่ายๆ นอกจากนี้ ในอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่รับข้อความ SMS ได้จะลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์ได้
หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอป คุณควรเสนอวิธีการลงชื่อเข้าใช้ที่ปลอดภัยยิ่งขึ้นควบคู่ไปด้วย และแจ้งให้ผู้ใช้ทราบถึงข้อดีข้อเสียด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase
หากต้องการให้ผู้ใช้ลงชื่อเข้าใช้ด้วย SMS คุณต้องเปิดใช้วิธีการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ก่อน โดยทำดังนี้
- ในคอนโซล Firebase ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ด้วยโทรศัพท์
-
ตั้งค่านโยบายในภูมิภาคที่คุณต้องการอนุญาตหรือปฏิเสธการส่งข้อความ SMS การตั้งค่านโยบายภูมิภาคของ SMS จะช่วยปกป้องแอปของคุณจากการละเมิด SMS ได้ สำหรับโปรเจ็กต์ใหม่ นโยบายเริ่มต้นจะไม่อนุญาตให้ใช้ภูมิภาคใดเลย
- ในคอนโซล Firebase ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์ > แท็บการตั้งค่า
- ในส่วนนโยบายภูมิภาคของ SMS ให้ตั้งค่านโยบายภูมิภาคของ SMS
เปิดใช้การตรวจสอบแอป
หากต้องการใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ Firebase ต้องสามารถยืนยันได้ว่าคำขอลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์มาจากแอปของคุณ Firebase Authentication ทำได้ 3 วิธีดังนี้
- Play Integrity API: หากผู้ใช้มีอุปกรณ์ที่ติดตั้ง Google Play services ไว้ และ Firebase Authentication สามารถยืนยันได้ว่าอุปกรณ์นั้นถูกต้องตามกฎหมายด้วย Play Integrity API การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ก็จะดำเนินการต่อได้ Play Integrity API เปิดใช้อยู่ในโปรเจ็กต์ที่ Google เป็นเจ้าของโดย Firebase Authentication ไม่ใช่ในโปรเจ็กต์ของคุณ การดำเนินการนี้จะไม่ส่งผลต่อโควต้า Play Integrity API ในโปรเจ็กต์ของคุณ การสนับสนุน Play Integrity พร้อมใช้งานใน Authentication SDK v21.2.0 ขึ้นไป (Firebase BoM v31.4.0 ขึ้นไป)
หากต้องการใช้ Play Integrity ให้ระบุลายนิ้วมือ SHA-256 ของแอปหากยังไม่ได้ดำเนินการ
-
ในคอนโซล Firebase ให้ไปที่
การตั้งค่า > แท็บทั่วไป - เลื่อนลงไปที่การ์ดแอปของคุณ เลือกแอป Android แล้วเพิ่มลายนิ้วมือ SHA-256 ในช่องลายนิ้วมือของใบรับรอง SHA
ดูรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA ของแอปได้ที่การตรวจสอบสิทธิ์ไคลเอ็นต์
-
ในคอนโซล Firebase ให้ไปที่
- การยืนยัน 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
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 เป็นแบบ Reentrant: หากคุณเรียกใช้หลายครั้ง เช่น ในเมธอด onStart ของกิจกรรม เมธอด verifyPhoneNumber จะไม่ส่ง SMS ครั้งที่ 2 เว้นแต่คำขอเดิมจะหมดเวลา
คุณสามารถใช้ลักษณะการทำงานนี้เพื่อกลับมาทำขั้นตอนการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ต่อได้หากแอปปิดก่อนที่ผู้ใช้จะลงชื่อเข้าใช้ (เช่น ขณะที่ผู้ใช้กำลังใช้แอป SMS) หลังจากเรียก verifyPhoneNumber แล้ว ให้ตั้งค่าแฟล็กที่ระบุว่าการยืนยันอยู่ระหว่างดำเนินการ จากนั้นบันทึก Flag ในเมธอด onSaveInstanceState ของกิจกรรมและกู้คืน Flag ใน onRestoreInstanceState สุดท้าย ในเมธอด onStart ของกิจกรรม ให้ตรวจสอบว่าการยืนยันกำลังดำเนินการอยู่หรือไม่ และหากใช่ ให้เรียกใช้ verifyPhoneNumber อีกครั้ง อย่าลืมล้าง Flag เมื่อการยืนยันเสร็จสมบูรณ์หรือล้มเหลว (ดู
การเรียกกลับของการยืนยัน)
หากต้องการจัดการการหมุนหน้าจอและกรณีอื่นๆ ของการรีสตาร์ทกิจกรรมอย่างง่ายดาย ให้ส่งกิจกรรมไปยังเมธอด verifyPhoneNumber ระบบจะยกเลิกการเชื่อมต่อ Callback โดยอัตโนมัติเมื่อกิจกรรมหยุดลง คุณจึงเขียนโค้ดการเปลี่ยน UI ในเมธอด Callback ได้อย่างอิสระ
นอกจากนี้ คุณยังแปลข้อความ SMS ที่ Firebase ส่งได้โดยระบุภาษาสำหรับการตรวจสอบสิทธิ์ผ่านเมธอด setLanguageCode ในอินสแตนซ์ Auth
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();
เมื่อเรียกใช้ PhoneAuthProvider.verifyPhoneNumber คุณต้องระบุอินสแตนซ์ของ OnVerificationStateChangedCallbacks ด้วย ซึ่งมีการใช้งานฟังก์ชัน Callback ที่จัดการผลลัพธ์ของคำขอ เช่น
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; } };
Callback การยืนยัน
ในแอปส่วนใหญ่ คุณจะใช้ Callback onVerificationCompleted, onVerificationFailed และ onCodeSent คุณอาจต้องใช้ onCodeAutoRetrievalTimeOut ด้วย ทั้งนี้ขึ้นอยู่กับข้อกำหนดของแอป
onVerificationCompleted(PhoneAuthCredential)
ระบบจะเรียกใช้เมธอดนี้ใน 2 สถานการณ์ต่อไปนี้
- การยืนยันทันที: ในบางกรณี ระบบจะยืนยันหมายเลขโทรศัพท์ได้ทันทีโดยไม่ต้องส่งหรือป้อนรหัสยืนยัน
- การดึงข้อมูลอัตโนมัติ: ในอุปกรณ์บางเครื่อง บริการ Google Play สามารถตรวจหา SMS ยืนยันตัวตนที่เข้ามาและทำการยืนยันโดยอัตโนมัติโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ (ความสามารถนี้อาจไม่พร้อมใช้งานกับผู้ให้บริการบางราย) ซึ่งจะใช้ SMS Retriever API ที่มีแฮช 11 อักขระที่ท้ายข้อความ SMS
PhoneAuthCredential ที่ส่งไปยัง Callback เพื่อลงชื่อเข้าใช้ให้ผู้ใช้ได้
onVerificationFailed(FirebaseException)
ระบบจะเรียกใช้เมธอดนี้เพื่อตอบสนองต่อคำขอยืนยันที่ไม่ถูกต้อง เช่น คำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)
ไม่บังคับ ระบบจะเรียกใช้เมธอดนี้หลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ระบุแล้ว
เมื่อเรียกใช้เมธอดนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกัน การยืนยันอัตโนมัติอาจดำเนินการอยู่เบื้องหลัง) จากนั้น หลังจากที่ผู้ใช้พิมพ์รหัสยืนยัน คุณจะใช้รหัสยืนยันและรหัสการยืนยันที่ส่งไปยังเมธอดเพื่อสร้างออบเจ็กต์ PhoneAuthCredential ได้ ซึ่งคุณจะใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ได้ อย่างไรก็ตาม แอปบางแอปอาจรอจนกว่าจะมีการเรียกใช้ onCodeAutoRetrievalTimeOut ก่อนที่จะแสดง UI รหัสยืนยัน (ไม่แนะนำ)
onCodeAutoRetrievalTimeOut(String verificationId)
ไม่บังคับ ระบบจะเรียกใช้เมธอดนี้หลังจากระยะหมดเวลาที่ระบุไว้ใน verifyPhoneNumber ผ่านไปโดยที่ onVerificationCompleted ไม่ทริกเกอร์ก่อน ในอุปกรณ์ที่ไม่มีซิมการ์ด ระบบจะเรียกใช้เมธอดนี้ทันทีเนื่องจากไม่สามารถดึงข้อมูล SMS โดยอัตโนมัติได้
แอปบางแอปจะบล็อกการป้อนข้อมูลของผู้ใช้จนกว่าระยะเวลาการยืนยันอัตโนมัติจะหมดลง จากนั้นจึงแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ไม่แนะนำ)
สร้างออบเจ็กต์ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้แล้ว ให้สร้างออบเจ็กต์ PhoneAuthCredential โดยใช้รหัสยืนยันและรหัสยืนยันที่ส่งไปยัง Callback onCodeSent หรือ onCodeAutoRetrievalTimeOut (เมื่อเรียกใช้ onVerificationCompleted คุณจะได้รับออบเจ็กต์ PhoneAuthCredential โดยตรง คุณจึงข้ามขั้นตอนนี้ได้)
หากต้องการสร้างออบเจ็กต์ PhoneAuthCredential ให้เรียกใช้ PhoneAuthProvider.getCredential ดังนี้
Kotlin
val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
Java
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
ลงชื่อเข้าใช้ให้ผู้ใช้
หลังจากได้รับออบเจ็กต์ PhoneAuthCredential ไม่ว่าจะใน Callback onVerificationCompleted หรือโดยการเรียกใช้ PhoneAuthProvider.getCredential ให้ทำตามขั้นตอนการลงชื่อเข้าใช้ให้เสร็จสมบูรณ์โดยส่งออบเจ็กต์ PhoneAuthCredential ไปยัง 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 } } } }); }
ทดสอบด้วยหมายเลขโทรศัพท์สมมติ
คุณตั้งค่าหมายเลขโทรศัพท์สมมติสำหรับการพัฒนาได้โดยใช้คอนโซล Firebase การทดสอบด้วยหมายเลขโทรศัพท์สมมติมีประโยชน์ดังนี้
- ทดสอบการตรวจสอบสิทธิ์หมายเลขโทรศัพท์โดยไม่ใช้โควต้าการใช้งาน
- ทดสอบการตรวจสอบสิทธิ์หมายเลขโทรศัพท์โดยไม่ต้องส่งข้อความ SMS จริง
- ทำการทดสอบติดต่อกันด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่ถูกจำกัด วิธีนี้จะช่วยลดความเสี่ยงที่แอปจะถูกปฏิเสธในระหว่างกระบวนการตรวจสอบของ App Store หากผู้ตรวจสอบใช้หมายเลขโทรศัพท์เดียวกันในการทดสอบ
- ทดสอบในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ได้อย่างง่ายดายโดยไม่ต้องดำเนินการเพิ่มเติม เช่น ความสามารถในการพัฒนาในโปรแกรมจำลอง iOS หรือโปรแกรมจำลองของ Android โดยไม่ต้องใช้บริการ Google Play
- เขียนการทดสอบการผสานรวมโดยไม่ถูกบล็อกจากการตรวจสอบความปลอดภัยที่มักใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดต่อไปนี้
- ตรวจสอบว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นและไม่มีอยู่จริง Firebase Authentication ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ตัวเลือกหนึ่งคือการใช้หมายเลขที่ขึ้นต้นด้วย 555 เป็นหมายเลขโทรศัพท์ทดสอบของสหรัฐอเมริกา เช่น +1 650-555-3434
- หมายเลขโทรศัพท์ต้องอยู่ในรูปแบบที่ถูกต้องตามความยาวและข้อจำกัดอื่นๆ โดยจะยังคงผ่านการตรวจสอบความถูกต้องเช่นเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณเพิ่มหมายเลขโทรศัพท์สำหรับการพัฒนาได้สูงสุด 10 หมายเลข
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่คาดเดาได้ยากและเปลี่ยนบ่อยๆ
สร้างหมายเลขโทรศัพท์และรหัสยืนยันสมมติ
- ในคอนโซล Firebase ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ด้วยโทรศัพท์ หากยังไม่ได้ดำเนินการ
- ขยายส่วนหมายเลขโทรศัพท์สำหรับการทดสอบ
-
ระบุหมายเลขโทรศัพท์ที่ต้องการทดสอบ เช่น
+1 650-555-3434 -
ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขนั้นๆ เช่น
654321 - คลิกเพิ่มสำหรับแต่ละหมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้อง แล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันได้โดยตรง ซึ่งจะช่วยให้คุณทำการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาได้โดยไม่พบปัญหาเกี่ยวกับโควต้าหรือการควบคุมปริมาณ นอกจากนี้ คุณยังทดสอบได้โดยตรงจาก iOS Simulator หรือโปรแกรมจำลองของ 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 ด้วยหมายเลขสมมติจะทริกเกอร์ Callback onCodeSent ซึ่งคุณจะต้องระบุรหัสยืนยันที่เกี่ยวข้อง ซึ่งจะช่วยให้ทดสอบในโปรแกรมจำลองของ 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)
นอกจากนี้ คุณยังทดสอบขั้นตอนการเรียกอัตโนมัติใน 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
// 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
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();