Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

ตรวจสอบสิทธิ์ด้วย Firebase บน Android โดยใช้หมายเลขโทรศัพท์

คุณสามารถใช้การตรวจสอบสิทธิ์ Firebase เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่มีอยู่ในข้อความ SMS

วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปของคุณคือการใช้ FirebaseUI ซึ่งรวมถึงวิดเจ็ตการลงชื่อเข้าใช้แบบดรอปอินที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับการลงชื่อเข้าใช้หมายเลขโทรศัพท์ ตลอดจนการลงชื่อเข้าใช้แบบใช้รหัสผ่านและแบบรวมศูนย์ -ใน. เอกสารนี้อธิบายวิธีใช้งานขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์โดยใช้ Firebase SDK

ก่อนจะเริ่ม

  1. หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ Android ของคุณ
  2. ใช้ Firebase Android BoM ประกาศการพึ่งพาสำหรับไลบรารี Firebase Authentication Android ใน ไฟล์ Gradle ของ โมดูล (ระดับแอป) (โดยปกติคือ app/build.gradle )

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.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:21.0.1'
    }
    

    คอตลิน+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.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:21.0.1'
    }
    
  3. หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก คอนโซล Firebase
  4. หากคุณยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปใน คอนโซล Firebase ให้ดำเนินการดังกล่าว ดูการ ตรวจสอบสิทธิ์ไคลเอ็นต์ของคุณ สำหรับข้อมูลเกี่ยวกับการค้นหาแฮช SHA-1 ของแอป

ความกังวลด้านความปลอดภัย

การตรวจสอบสิทธิ์โดยใช้หมายเลขโทรศัพท์เพียงหมายเลขเดียวในขณะที่สะดวกนั้นมีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มี เนื่องจากการครอบครองหมายเลขโทรศัพท์สามารถถ่ายโอนระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ ในอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่สามารถรับข้อความ SMS สามารถลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์ได้

หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอป คุณควรนำเสนอควบคู่ไปกับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยยิ่งขึ้น และแจ้งให้ผู้ใช้ทราบถึงข้อแลกเปลี่ยนด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้หมายเลขโทรศัพท์

เปิดใช้การลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase

ในการลงชื่อเข้าใช้ผู้ใช้ทาง SMS คุณต้องเปิดใช้งานวิธีการลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ของคุณก่อน:

  1. ใน คอนโซล Firebase ให้เปิดส่วนการ ตรวจสอบสิทธิ์
  2. ใน หน้า วิธี การ ลงชื่อเข้า ใช้ ให้เปิดใช้งานวิธีการลงชื่อเข้าใช้ หมายเลขโทรศัพท์

โควต้าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์ของ Firebase สูงพอที่แอปส่วนใหญ่จะไม่ได้รับผลกระทบ อย่างไรก็ตาม หากคุณต้องการลงชื่อเข้าใช้ผู้ใช้จำนวนมากด้วยการตรวจสอบสิทธิ์ทางโทรศัพท์ คุณอาจต้องอัปเกรดแผนราคาของคุณ ดูหน้า ราคา

เปิดใช้งานการตรวจสอบแอป

ในการใช้การตรวจสอบหมายเลขโทรศัพท์ Firebase ต้องสามารถยืนยันได้ว่าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์นั้นมาจากแอปของคุณ การตรวจสอบสิทธิ์ Firebase ทำได้สองวิธี:

  • SafetyNet : หากผู้ใช้มีอุปกรณ์ที่ติดตั้งบริการ Google Play และการตรวจสอบสิทธิ์ของ Firebase สามารถตรวจสอบอุปกรณ์ว่าถูกต้องด้วย Android SafetyNet การ ลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สามารถดำเนินการต่อได้
  • วิธีเปิดใช้งาน SafetyNet สำหรับใช้กับการตรวจสอบสิทธิ์ Firebase:

    1. ใน Google Cloud Console ให้เปิดใช้งาน Android DeviceCheck API สำหรับโครงการของคุณ ระบบจะใช้คีย์ Firebase API เริ่มต้น และต้องได้รับอนุญาตให้เข้าถึง DeviceCheck API
    2. หากคุณยังไม่ได้ระบุลายนิ้วมือ SHA-256 ของแอป ให้ดำเนินการจาก หน้าการตั้งค่า ของคอนโซล Firebase อ้างถึงการ รับรองความถูกต้องไคลเอ็นต์ของคุณ สำหรับรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA-256 ของแอป
  • การยืนยัน reCAPTCHA : ในกรณีที่ใช้ SafetyNet ไม่ได้ เช่น เมื่อผู้ใช้ไม่มีบริการ Google Play Services หรือเมื่อทดสอบแอปของคุณบนโปรแกรมจำลอง Firebase Authentication จะใช้การตรวจสอบ reCAPTCHA เพื่อทำให้ขั้นตอนการลงชื่อเข้าใช้ทางโทรศัพท์เสร็จสมบูรณ์ ความท้าทาย reCAPTCHA มักจะทำให้เสร็จได้โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย โปรดทราบว่าโฟลว์นี้กำหนดให้ SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ

ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้

ในการเริ่มต้นลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้พิมพ์หมายเลขโทรศัพท์ ข้อกำหนดทางกฎหมายแตกต่างกันไป แต่ตามแนวทางปฏิบัติที่ดีที่สุดและเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ของคุณ คุณควรแจ้งให้พวกเขาทราบว่าหากพวกเขาใช้การลงชื่อเข้าใช้ทางโทรศัพท์ พวกเขาอาจได้รับข้อความ 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 ของ Activity ของคุณและกู้คืนแฟ 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 ยืนยันที่เข้ามาโดยอัตโนมัติและดำเนินการตรวจสอบโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ (ความสามารถนี้อาจไม่สามารถใช้ได้กับผู้ให้บริการบางราย) ซึ่งใช้ SMS Retriever API ซึ่งรวมถึงแฮช 11 อักขระที่ส่วนท้ายของข้อความ SMS
ไม่ว่าในกรณีใด หมายเลขโทรศัพท์ของผู้ใช้ได้รับการยืนยันเรียบร้อยแล้ว และคุณสามารถใช้วัตถุ PhoneAuthCredential ที่ส่งผ่านไปยังการติดต่อกลับเพื่อ ลงชื่อเข้าใช้ผู้ใช้

onVerificationFailed (FirebaseException)

วิธีนี้เรียกว่าเพื่อตอบสนองต่อคำขอยืนยันที่ไม่ถูกต้อง เช่น คำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง

onCodeSent (String verificationId, PhoneAuthProvider.ForceResendingToken)

ไม่จำเป็น. วิธีนี้เรียกว่าหลังจากส่งรหัสยืนยันทาง 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();
                        // 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
                        }
                    }
                }
            });
}

คอตลิน+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")

                    val user = task.result?.user
                } else {
                    // Sign in failed, display a message and update the UI
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    if (task.exception is FirebaseAuthInvalidCredentialsException) {
                        // The verification code entered was invalid
                    }
                    // Update UI
                }
            }
}

ทดสอบด้วยหมายเลขโทรศัพท์สมมติ

คุณสามารถตั้งค่าหมายเลขโทรศัพท์สมมติสำหรับการพัฒนาผ่านคอนโซล Firebase การทดสอบด้วยหมายเลขโทรศัพท์สมมติให้ประโยชน์เหล่านี้:

  • ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ใช้โควต้าการใช้งานของคุณ
  • ทดสอบการตรวจสอบหมายเลขโทรศัพท์โดยไม่ต้องส่งข้อความ SMS จริง
  • ทำการทดสอบต่อเนื่องด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่ถูกจำกัดปริมาณ ซึ่งจะช่วยลดความเสี่ยงที่จะถูกปฏิเสธระหว่างกระบวนการตรวจสอบ App Store หากผู้ตรวจสอบบังเอิญใช้หมายเลขโทรศัพท์เดียวกันสำหรับการทดสอบ
  • ทดสอบได้อย่างง่ายดายในสภาพแวดล้อมการพัฒนาโดยไม่ต้องใช้ความพยายามเพิ่มเติม เช่น ความสามารถในการพัฒนาในโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องใช้ Google Play Services
  • เขียนการทดสอบการรวมโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยซึ่งปกติแล้วจะใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมที่ใช้งานจริง

หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้:

  1. ตรวจสอบให้แน่ใจว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นจริง และยังไม่มีอยู่จริง การตรวจสอบสิทธิ์ Firebase ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้หมายเลขนำหน้า 555 เป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา เช่น +1 650-555-3434
  2. หมายเลขโทรศัพท์ต้องอยู่ในรูปแบบที่ถูกต้องสำหรับความยาวและข้อจำกัดอื่นๆ พวกเขาจะยังคงผ่านการตรวจสอบเดียวกันกับหมายเลขโทรศัพท์ของผู้ใช้จริง
  3. คุณสามารถเพิ่มหมายเลขโทรศัพท์สำหรับการพัฒนาได้สูงสุด 10 หมายเลข
  4. ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่เดายากและเปลี่ยนบ่อย

สร้างหมายเลขโทรศัพท์สมมติและรหัสยืนยัน

  1. ใน คอนโซล Firebase ให้เปิดส่วนการ ตรวจสอบสิทธิ์
  2. ในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการโทรศัพท์ หากคุณยังไม่ได้ดำเนินการ
  3. เปิดเมนู หมายเลขโทรศัพท์สำหรับทดสอบ หีบเพลง
  4. ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบ เช่น +1 650-555-3434
  5. ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขดังกล่าว เช่น 654321
  6. เพิ่ม หมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ

การทดสอบด้วยตนเอง

คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในใบสมัครของคุณได้โดยตรง ซึ่งช่วยให้คุณทำการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาได้โดยไม่มีปัญหาโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องติดตั้ง Google Play Services

เมื่อคุณให้หมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง คุณต้องระบุรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้เพื่อลงชื่อเข้าใช้ให้เสร็จสมบูรณ์

เมื่อลงชื่อเข้าใช้เสร็จสมบูรณ์ ผู้ใช้ Firebase จะถูกสร้างขึ้นด้วยหมายเลขโทรศัพท์นั้น ผู้ใช้มีพฤติกรรมและคุณสมบัติเหมือนกันกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึงฐานข้อมูลเรียลไทม์/Cloud Firestore และบริการอื่นๆ ด้วยวิธีเดียวกัน โทเค็น ID ที่สร้างขึ้นในระหว่างกระบวนการนี้มีลายเซ็นเดียวกันกับผู้ใช้หมายเลขโทรศัพท์จริง

อีกทางเลือกหนึ่งคือ ตั้งค่าบทบาททดสอบผ่านการอ้างสิทธิ์ที่กำหนดเอง กับผู้ใช้เหล่านี้ เพื่อแยกความแตกต่างว่าเป็นผู้ใช้ปลอม หากคุณต้องการจำกัดการเข้าถึงเพิ่มเติม

หากต้องการทริกเกอร์โฟลว์ reCAPTCHA ด้วยตนเองสำหรับการทดสอบ ให้ใช้ forceRecaptchaFlowForTesting()

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

การทดสอบบูรณาการ

นอกเหนือจากการทดสอบด้วยตนเองแล้ว การตรวจสอบสิทธิ์ของ Firebase ยังมี API เพื่อช่วยเขียนการทดสอบการผสานรวมสำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้ปิดใช้งานการตรวจสอบแอปโดยปิดใช้งานข้อกำหนด reCAPTCHA ในเว็บและการแจ้งเตือนแบบเงียบใน iOS สิ่งนี้ทำให้การทดสอบอัตโนมัติเป็นไปได้ในโฟลว์เหล่านี้และง่ายต่อการนำไปใช้ นอกจากนี้ยังช่วยให้สามารถทดสอบขั้นตอนการยืนยันทันทีบน Android

บน Android ให้โทร setAppVerificationDisabledForTesting() ก่อนการเรียก signInWithPhoneNumber การดำเนินการนี้จะปิดใช้งานการตรวจสอบแอปโดยอัตโนมัติ ทำให้คุณสามารถส่งหมายเลขโทรศัพท์โดยไม่ต้องแก้ไขด้วยตนเอง โปรดทราบว่าถึงแม้จะปิดใช้งาน reCAPTCHA และ/หรือ SafetyNet การใช้หมายเลขโทรศัพท์จริงจะยังคงลงชื่อเข้าใช้ไม่สำเร็จ เฉพาะหมายเลขโทรศัพท์สมมติเท่านั้นที่สามารถใช้กับ API นี้ได้

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

การโทร verifyPhoneNumber ด้วยหมายเลขสมมติจะเรียกการโทรกลับ onCodeSent ซึ่งคุณจะต้องระบุรหัสยืนยันที่เกี่ยวข้อง อนุญาตให้ทำการทดสอบใน Android Emulators

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(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)

นอกจากนี้ คุณสามารถทดสอบ setAutoRetrievedSmsCodeForPhoneNumber การดึงข้อมูลอัตโนมัติใน 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 Realtime Database และ Cloud Storage Security Rules คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้

คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย เชื่อมโยงข้อมูล รับรองของผู้ให้บริการตรวจสอบสิทธิ์ กับบัญชีผู้ใช้ที่มีอยู่

หากต้องการออกจากระบบผู้ใช้ ให้โทร signOut :

Java

FirebaseAuth.getInstance().signOut();

คอตลิน+KTX

Firebase.auth.signOut()