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

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

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

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

  1. หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ Android ของคุณ
  2. ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ <project>/<app-module>/build.gradle.kts หรือ <project>/<app-module>/build.gradle ) ให้เพิ่มการพึ่งพาสำหรับ Firebase Authentication ไลบรารี่สำหรับ Android เราขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมเวอร์ชันไลบรารี
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.8.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:22.3.1")
    }
    
    กำลังมองหาโมดูลไลบรารีเฉพาะของ Kotlin อยู่ใช่ไหม? เริ่มตั้งแต่ เดือนตุลาคม 2023 (Firebase BoM 32.5.0) ทั้งนักพัฒนา Kotlin และ Java สามารถพึ่งพาโมดูลไลบรารีหลักได้ (สำหรับรายละเอียด โปรดดู คำถามที่พบบ่อยเกี่ยวกับโครงการริเริ่มนี้ )
  3. หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจาก คอนโซล Firebase
  4. หากคุณยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปใน คอนโซล Firebase ให้ดำเนินการดังกล่าว ดู การตรวจสอบสิทธิ์ไคลเอ็นต์ของคุณ สำหรับข้อมูลเกี่ยวกับการค้นหาแฮช SHA-1 ของแอปของคุณ

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

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

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

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

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

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

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

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

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

  • Play Integrity API : หากผู้ใช้มีอุปกรณ์ที่ติดตั้งบริการ Google Play และการตรวจสอบสิทธิ์ Firebase สามารถยืนยันอุปกรณ์ว่าถูกต้องด้วย Play Integrity API ก็สามารถลงชื่อเข้าใช้หมายเลขโทรศัพท์ได้ Play Integrity API เปิดใช้อยู่ในโปรเจ็กต์ที่ Google เป็นเจ้าของโดย Firebase Authentication ไม่ใช่โปรเจ็กต์ของคุณ สิ่งนี้ไม่ส่งผลต่อโควต้า Play Integrity API ในโปรเจ็กต์ของคุณ การสนับสนุน Play Integrity Support ใช้งานได้กับ Authentication SDK v21.2.0+ (Firebase BoM v31.4.0+)

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

  • การยืนยัน reCAPTCHA : ในกรณีที่ไม่สามารถใช้ Play Integrity ได้ เช่น เมื่อผู้ใช้มีอุปกรณ์ ที่ไม่ได้ ติดตั้งบริการ Google Play การตรวจสอบสิทธิ์ Firebase จะใช้การตรวจสอบ reCAPTCHA เพื่อดำเนินการลงชื่อเข้าใช้โทรศัพท์ให้เสร็จสมบูรณ์ ความท้าทาย reCAPTCHA มักจะเสร็จสิ้นได้โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย โปรดทราบว่าขั้นตอนนี้กำหนดให้ SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ ขั้นตอนนี้ยังกำหนดให้คีย์ API ของคุณไม่จำกัดหรืออยู่ในรายการที่อนุญาตสำหรับ PROJECT_ID .firebaseapp.com

    สถานการณ์บางอย่างที่ reCAPTCHA ถูกทริกเกอร์:

    • หากอุปกรณ์ของผู้ใช้ไม่ได้ติดตั้งบริการ Google Play
    • หากแอปไม่ได้เผยแพร่ผ่าน Google Play สโตร์ (บน Authentication SDK v21.2.0+ )
    • หากโทเค็น SafetyNet ที่ได้รับไม่ถูกต้อง (ใน Authentication SDK เวอร์ชัน < v21.2.0)

    เมื่อใช้ SafetyNet หรือ Play Integrity สำหรับการตรวจสอบแอป ช่อง %APP_NAME% ในเทมเพลต SMS จะถูกเติมด้วยชื่อแอปที่กำหนดจาก Google Play Store ในสถานการณ์ที่มีการทริกเกอร์ reCAPTCHA %APP_NAME% จะถูกเติมเป็น PROJECT_ID .firebaseapp.com

คุณสามารถบังคับใช้ขั้นตอนการยืนยัน reCAPTCHA ได้ด้วย forceRecaptchaFlowForTesting คุณสามารถปิดใช้การยืนยันแอป (เมื่อใช้หมายเลขโทรศัพท์สมมติ) ได้โดยใช้ setAppVerificationDisabledForTesting

การแก้ไขปัญหา

  • ข้อผิดพลาด "ไม่มีสถานะเริ่มต้น" เมื่อใช้ reCAPTCHA สำหรับการตรวจสอบแอป

    กรณีนี้อาจเกิดขึ้นเมื่อขั้นตอน reCAPTCHA เสร็จสมบูรณ์แต่ไม่ได้เปลี่ยนเส้นทางผู้ใช้กลับไปยังแอปพลิเคชันดั้งเดิม หากสิ่งนี้เกิดขึ้น ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยัง URL สำรอง PROJECT_ID .firebaseapp.com/__/auth/handler บนเบราว์เซอร์ Firefox การเปิดลิงก์แอปแบบเนทีฟจะถูกปิดใช้งานตามค่าเริ่มต้น หากคุณเห็นข้อผิดพลาดข้างต้นบน Firefox ให้ทำตามขั้นตอนใน ตั้งค่า Firefox สำหรับ Android เพื่อเปิดลิงก์ในแอปเนทีฟ เพื่อเปิดใช้งานการเปิดลิงก์แอป

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

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

จากนั้นส่งหมายเลขโทรศัพท์ไปที่วิธี PhoneAuthProvider.verifyPhoneNumber เพื่อขอให้ Firebase ยืนยันหมายเลขโทรศัพท์ของผู้ใช้ ตัวอย่างเช่น:

Kotlin+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)

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 ครั้งที่สอง เว้นแต่คำขอเดิมหมดเวลาแล้ว

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

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

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

Kotlin+KTX

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 ด้วย ซึ่งมีการใช้งานฟังก์ชันการโทรกลับที่จัดการผลลัพธ์ของคำขอ ตัวอย่างเช่น:

Kotlin+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
        } 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 ขึ้นอยู่กับข้อกำหนดของแอปของคุณ

onVerification เสร็จสมบูรณ์ (PhoneAuthCredential)

วิธีการนี้ถูกเรียกในสองสถานการณ์:

  • การยืนยันทันที: ในบางกรณี หมายเลขโทรศัพท์สามารถตรวจสอบได้ทันทีโดยไม่จำเป็นต้องส่งหรือป้อนรหัสยืนยัน
  • การดึงข้อมูลอัตโนมัติ: ในอุปกรณ์บางประเภท บริการ Google Play สามารถตรวจจับ SMS ยืนยันขาเข้าได้โดยอัตโนมัติ และดำเนินการยืนยันโดยไม่ต้องดำเนินการใดๆ จากผู้ใช้ (ความสามารถนี้อาจไม่สามารถใช้ได้กับผู้ให้บริการบางราย) ซึ่งใช้ SMS Retriever API ซึ่งมีแฮช 11 อักขระต่อท้ายข้อความ SMS
ไม่ว่าในกรณีใด หมายเลขโทรศัพท์ของผู้ใช้ได้รับการยืนยันเรียบร้อยแล้ว และคุณสามารถใช้ออบเจ็กต์ PhoneAuthCredential ที่ส่งไปยังการโทรกลับเพื่อ ลงชื่อเข้าใช้ผู้ใช้ได้

onVerificationFailed (FirebaseException)

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

onCodeSent (รหัสตรวจสอบสตริง, PhoneAuthProvider.ForceResendingToken)

ไม่จำเป็น. วิธีการนี้เรียกว่าหลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ให้ไว้

เมื่อเรียกใช้วิธีนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ขณะเดียวกัน การยืนยันอัตโนมัติอาจดำเนินการอยู่เบื้องหลัง) จากนั้น หลังจากที่ผู้ใช้พิมพ์รหัสยืนยันแล้ว คุณจะสามารถใช้รหัสยืนยันและ ID ยืนยันที่ส่งไปยังวิธีการสร้างวัตถุ PhoneAuthCredential ซึ่ง คุณสามารถใช้ในการลงชื่อเข้าใช้ผู้ใช้ได้ อย่างไรก็ตาม บางแอปอาจรอจนกว่าจะมีการเรียก onCodeAutoRetrievalTimeOut ก่อนที่จะแสดง UI รหัสยืนยัน (ไม่แนะนำ)

onCodeAutoRetrievalTimeOut (รหัสยืนยันสตริง)

ไม่จำเป็น. เมธอดนี้ถูกเรียกหลังจากระยะเวลาหมดเวลาที่ระบุเพื่อ verifyPhoneNumber ผ่านไปโดยไม่มีการทริกเกอร์ onVerificationCompleted ก่อน บนอุปกรณ์ที่ไม่มีซิมการ์ด ระบบจะเรียกใช้วิธีนี้ทันทีเนื่องจากไม่สามารถดึง SMS อัตโนมัติได้

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

สร้างวัตถุ PhoneAuthCredential

หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้แล้ว ให้สร้างออบเจ็กต์ PhoneAuthCredential โดยใช้รหัสยืนยันและ ID ยืนยันที่ส่งไปยังการโทรกลับ onCodeSent หรือ onCodeAutoRetrievalTimeOut (เมื่อเรียกใช้ onVerificationCompleted คุณจะได้รับออบเจ็กต์ PhoneAuthCredential โดยตรง ดังนั้นคุณจึงสามารถข้ามขั้นตอนนี้ได้)

หากต้องการสร้างวัตถุ PhoneAuthCredential ให้เรียก PhoneAuthProvider.getCredential :

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

เข้าสู่ระบบผู้ใช้

หลังจากที่คุณได้รับออบเจ็กต์ PhoneAuthCredential ไม่ว่าจะอยู่ในการโทรกลับ onVerificationCompleted หรือโดยการเรียก PhoneAuthProvider.getCredential ให้ดำเนินการขั้นตอนการลงชื่อเข้าใช้ให้เสร็จสิ้นโดยส่งออบเจ็กต์ PhoneAuthCredential ไปที่ FirebaseAuth.signInWithCredential :

Kotlin+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
            }
        }
}

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
  • เขียนการทดสอบการรวมระบบโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยที่ปกติใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมการใช้งานจริง

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

  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 ยังมี API เพื่อช่วยเขียนการทดสอบการรวมสำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้ปิดใช้การตรวจสอบแอปโดยปิดใช้ข้อกำหนด reCAPTCHA ในเว็บและการแจ้งเตือนแบบพุชใน iOS ซึ่งทำให้การทดสอบอัตโนมัติเป็นไปได้ในโฟลว์เหล่านี้และนำไปใช้งานได้ง่ายขึ้น นอกจากนี้ ยังช่วยให้สามารถทดสอบขั้นตอนการยืนยันได้ทันทีบน Android

บน Android ให้เรียก setAppVerificationDisabledForTesting() ก่อนการเรียก signInWithPhoneNumber การดำเนินการนี้จะปิดใช้งานการตรวจสอบแอปโดยอัตโนมัติ ทำให้คุณสามารถส่งหมายเลขโทรศัพท์ได้โดยไม่ต้องแก้ไขด้วยตนเอง แม้ว่า Play Integrity และ reCAPTCHA จะปิดใช้อยู่ แต่การใช้หมายเลขโทรศัพท์จริงจะยังคงลงชื่อเข้าใช้ไม่สำเร็จ 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(@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+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 สโตร์

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+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 :

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();