Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

ก่อนจะเริ่ม

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

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.1')
    
        // 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:29.0.1')
    
        // 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 เปิดใช้งาน API Android DeviceCheck สำหรับโครงการของคุณ ระบบจะใช้คีย์ Firebase API เริ่มต้น และต้องได้รับอนุญาตให้เข้าถึง DeviceCheck API
    2. หากคุณยังไม่ได้ระบุของแอป SHA-256 ลายนิ้วมือทำจาก หน้าการตั้งค่า ของคอนโซล Firebase อ้างถึง การตรวจสอบสิทธิ์ลูกค้าของ สำหรับรายละเอียดเกี่ยวกับวิธีการที่จะได้รับของแอป SHA-256 ลายนิ้วมือ
  • ตรวจสอบ reCAPTCHA: ในกรณีที่ SafetyNet ไม่สามารถนำมาใช้เช่นเมื่อผู้ใช้ไม่ได้รับการสนับสนุนบริการของ Google Play หรือเมื่อการทดสอบแอปบนโปรแกรมจำลอง, Firebase รับรองความถูกต้องใช้การตรวจสอบ 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: ถ้าคุณเรียกมันหลายครั้งเช่นในกิจกรรม 's onStart method, verifyPhoneNumber วิธีการจะไม่ส่ง SMS สองเว้นแต่คำขอเดิมได้หมดเวลา

คุณสามารถใช้ลักษณะการทำงานนี้เพื่อดำเนินการลงชื่อเข้าใช้หมายเลขโทรศัพท์ต่อได้ หากแอปของคุณปิดก่อนที่ผู้ใช้จะลงชื่อเข้าใช้ได้ (เช่น ในขณะที่ผู้ใช้ใช้แอป SMS) หลังจากที่คุณเรียก verifyPhoneNumber ตั้งค่าสถานะที่ระบุการยืนยันในความคืบหน้า จากนั้นให้บันทึกธงในกิจกรรมของคุณ onSaveInstanceState วิธีการและเรียกคืนธงใน onRestoreInstanceState สุดท้ายในกิจกรรมของคุณ onStart วิธีการตรวจสอบว่าการตรวจสอบมีอยู่แล้วในความคืบหน้าและถ้าเป็นเช่นนั้นเรียก verifyPhoneNumber อีกครั้ง ให้แน่ใจว่าได้ล้างธงเมื่อตรวจสอบเสร็จสมบูรณ์หรือไม่ (ดู เรียกกลับตรวจสอบ )

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

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

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 เรียกครั้งแรก บนอุปกรณ์ที่ไม่มีซิมการ์ด ระบบจะเรียกวิธีนี้ทันทีเนื่องจากไม่สามารถดึง 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)

นอกจากนี้คุณสามารถทดสอบกระแสอัตโนมัติดึงใน 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 เรียลไทม์และการจัดเก็บเมฆ กฎการรักษาความปลอดภัย , คุณจะได้รับการลงนามใน ID ผู้ใช้ของผู้ใช้ที่ไม่ซ้ำกันจาก auth ตัวแปรและใช้ในการควบคุมสิ่งที่ข้อมูลที่เข้าถึงผู้ใช้สามารถ

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

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

Java

FirebaseAuth.getInstance().signOut();

คอตลิน+KTX

Firebase.auth.signOut()