คุณใช้ 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:34.0.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 เวอร์ชันที่เข้ากันได้อยู่เสมอ
(ทางเลือก) เพิ่มการอ้างอิงไลบรารี Firebase โดยไม่ใช้ BoM
หากเลือกไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันของไลบรารี Firebase แต่ละรายการ ในบรรทัดการอ้างอิง
โปรดทราบว่าหากคุณใช้ไลบรารี 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:24.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 Integrity พร้อมใช้งานใน
Authentication SDK เวอร์ชัน 21.2.0 ขึ้นไป
(Firebase BoM เวอร์ชัน 31.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 เวอร์ชัน 21.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
เป็นแบบเรียกซ้ำได้ หากคุณเรียกใช้หลายครั้ง เช่น ในเมธอด onStart
ของกิจกรรม เมธอด verifyPhoneNumber
จะไม่ส่ง SMS ครั้งที่ 2 เว้นแต่คำขอเดิมจะหมดเวลา
คุณสามารถใช้ลักษณะการทำงานนี้เพื่อดำเนินการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ต่อได้หากแอปปิดก่อนที่ผู้ใช้จะลงชื่อเข้าใช้ได้ (เช่น ขณะที่ผู้ใช้กำลังใช้แอป SMS) หลังจากโทรหา verifyPhoneNumber
แล้ว ให้ตั้งค่าสถานะที่
ระบุว่ากำลังดำเนินการยืนยัน จากนั้น ให้บันทึก Flag ในเมธอด Activity ของคุณ
onSaveInstanceState
และกู้คืน Flag ใน
onRestoreInstanceState
สุดท้าย ในเมธอด Activity ของคุณ
onStart
ให้ตรวจสอบว่าการยืนยันอยู่ระหว่างดำเนินการหรือไม่ และ
หากใช่ ให้เรียกใช้ verifyPhoneNumber
อีกครั้ง อย่าลืมล้างสถานะเมื่อการยืนยันเสร็จสมบูรณ์หรือไม่สำเร็จ (ดู
การเรียกกลับของการยืนยัน)
หากต้องการจัดการการหมุนหน้าจอและอินสแตนซ์อื่นๆ ของการรีสตาร์ทกิจกรรมอย่างง่ายดาย
ให้ส่งกิจกรรมไปยังเมธอด verifyPhoneNumber
ระบบจะยกเลิกการเชื่อมต่อการเรียกกลับโดยอัตโนมัติเมื่อกิจกรรมหยุดทำงาน คุณจึงเขียนโค้ดการเปลี่ยน UI ในเมธอดการเรียกกลับได้อย่างอิสระ
คุณยังแปลข้อความ 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; } };
การเรียกกลับเพื่อยืนยัน
ในแอปส่วนใหญ่ คุณจะใช้แฮนเดิล onVerificationCompleted
,
onVerificationFailed
และ onCodeSent
คุณอาจติดตั้งใช้งาน onCodeAutoRetrievalTimeOut
ด้วย ทั้งนี้ขึ้นอยู่กับข้อกำหนดของแอป
onVerificationCompleted(PhoneAuthCredential)
ระบบจะเรียกใช้เมธอดนี้ใน 2 กรณีต่อไปนี้
- การยืนยันทันที: ในบางกรณี ระบบจะยืนยันหมายเลขโทรศัพท์ได้ทันที โดยไม่ต้องส่งหรือป้อนรหัสยืนยัน
- การดึงข้อมูลอัตโนมัติ: ในอุปกรณ์บางเครื่อง บริการ Google Play จะ ตรวจหา SMS ยืนยันที่เข้ามาโดยอัตโนมัติและทำการ ยืนยันโดยไม่ต้องให้ผู้ใช้ดำเนินการ (ความสามารถนี้อาจไม่พร้อมใช้งานกับผู้ให้บริการบางราย) โดยใช้ SMS Retriever API ซึ่ง มีแฮช 11 อักขระที่ท้ายข้อความ SMS
PhoneAuthCredential
ที่ส่งไปยัง
การเรียกกลับเพื่อลงชื่อเข้าใช้ผู้ใช้
onVerificationFailed(FirebaseException)
เมธอดนี้จะเรียกใช้เพื่อตอบสนองต่อคำขอยืนยันที่ไม่ถูกต้อง เช่น คำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)
ไม่บังคับ ระบบจะเรียกใช้วิธีนี้หลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ระบุ
เมื่อเรียกใช้เมธอดนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้
พิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกัน
การยืนยันอัตโนมัติอาจดำเนินการในเบื้องหลัง) จากนั้นหลังจากที่ผู้ใช้
พิมพ์รหัสยืนยันแล้ว คุณสามารถใช้รหัสยืนยันและ
รหัสยืนยันที่ส่งไปยังเมธอดเพื่อสร้างออบเจ็กต์ PhoneAuthCredential
ซึ่งคุณจะใช้เพื่อลงชื่อเข้าใช้
ผู้ใช้ได้ อย่างไรก็ตาม แอปบางแอปอาจรอจนกว่าจะมีการเรียกใช้
onCodeAutoRetrievalTimeOut
ก่อนที่จะแสดง UI รหัสยืนยัน (ไม่แนะนำ)
onCodeAutoRetrievalTimeOut(String verificationId)
ไม่บังคับ ระบบจะเรียกใช้เมธอดนี้หลังจากระยะหมดเวลาที่ระบุไว้ใน
verifyPhoneNumber
ผ่านไปแล้วโดยที่
onVerificationCompleted
ไม่ได้ทริกเกอร์ก่อน ในอุปกรณ์ที่ไม่มีซิมการ์ด ระบบจะเรียกใช้วิธีนี้ทันทีเนื่องจากไม่สามารถดึงข้อมูล SMS โดยอัตโนมัติได้
แอปบางแอปจะบล็อกอินพุตของผู้ใช้จนกว่าระยะเวลาการยืนยันอัตโนมัติจะหมด และจะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยัน จากข้อความ SMS (ไม่แนะนำ)
สร้างออบเจ็กต์ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้แล้ว ให้สร้างออบเจ็กต์ PhoneAuthCredential
โดยใช้รหัสยืนยันและรหัสการยืนยันที่ส่งไปยังแฮนเดิลเลอร์ onCodeSent
หรือแฮนเดิลเลอร์ onCodeAutoRetrievalTimeOut
(เมื่อเรียกใช้
onVerificationCompleted
คุณจะได้รับออบเจ็กต์
PhoneAuthCredential
โดยตรง จึงข้ามขั้นตอนนี้ได้)
หากต้องการสร้างออบเจ็กต์ PhoneAuthCredential
ให้เรียกใช้
PhoneAuthProvider.getCredential
ดังนี้
Kotlin
val credential = PhoneAuthProvider.getCredential(verificationId!!, code)
Java
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
ลงชื่อเข้าใช้ในฐานะผู้ใช้
หลังจากได้รับออบเจ็กต์ PhoneAuthCredential
ไม่ว่าจะใน
onVerificationCompleted
Callback หรือโดยการเรียก
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 ให้เปิดส่วน การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการโทรศัพท์ หากยังไม่ได้ดำเนินการ
- เปิดเมนูหมายเลขโทรศัพท์สำหรับการทดสอบแบบ Accordion
- ระบุหมายเลขโทรศัพท์ที่ต้องการทดสอบ เช่น +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 ได้
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();