Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

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

ก่อนที่คุณจะเริ่ม

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

    Java

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

    โคตรลิน + KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:26.6.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:20.0.3'
    }
    
  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 สำหรับโครงการของคุณ จะใช้คีย์ API เริ่มต้นของ Firebase และต้องได้รับอนุญาตให้เข้าถึง 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: ถ้าคุณเรียกมันหลายครั้งเช่นในวิธีการ onStart ของกิจกรรมวิธีการตรวจ verifyPhoneNumber จะไม่ส่ง SMS ที่สองเว้นแต่ว่าคำขอเดิมจะหมดเวลา

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

onVerificationFailed (FirebaseException)

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

onCodeSent (การตรวจสอบสตริง, PhoneAuthProviderForceResendingToken)

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

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

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

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

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

  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

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

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

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

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

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

การทดสอบการผสานรวม

นอกเหนือจากการทดสอบด้วยตนเองแล้ว Firebase Authentication ยังมี 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 และ กฎความปลอดภัยของ Cloud Storage คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้

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

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

Java

FirebaseAuth.getInstance().signOut();

โคตรลิน + KTX

Firebase.auth.signOut()