คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่อยู่ในข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปของคุณคือการใช้ FirebaseUI ซึ่งมีวิดเจ็ตการลงชื่อเข้าใช้แบบดรอปอินที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ตลอดจนการลงชื่อเข้าใช้ด้วยรหัสผ่านและแบบรวมศูนย์ -ใน. เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนที่คุณจะเริ่มต้น
- หากคุณยังไม่ได้ดำเนินการ ให้ เพิ่ม Firebase ในโครงการ Android ของคุณ
- ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ
<project>/<app-module>/build.gradle
) ให้เพิ่มการพึ่งพาสำหรับไลบรารี Firebase Authentication Android ขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมการกำหนดเวอร์ชันของไลบรารีKotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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-ktx' }
เมื่อใช้ 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-ktx:21.1.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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:21.1.0' }
- หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจาก คอนโซล Firebase
- หากคุณยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปใน คอนโซล Firebase ให้ดำเนินการดังกล่าว ดูการ ตรวจสอบสิทธิ์ไคลเอ็นต์ของคุณ สำหรับข้อมูลเกี่ยวกับการค้นหาแฮช SHA-1 ของแอป
ข้อกังวลด้านความปลอดภัย
การพิสูจน์ตัวตนโดยใช้เพียงหมายเลขโทรศัพท์นั้นสะดวก แต่มีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มี เนื่องจากสามารถโอนหมายเลขโทรศัพท์ระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ บนอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่สามารถรับข้อความ SMS ได้สามารถลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์
หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอปของคุณ คุณควรนำเสนอควบคู่ไปกับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยมากขึ้น และแจ้งให้ผู้ใช้ทราบถึงข้อเสียด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้งานการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโครงการ Firebase ของคุณ
ในการลงชื่อเข้าใช้ผู้ใช้ด้วย SMS คุณต้องเปิดใช้งานวิธีการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ของคุณก่อน:
- ใน คอนโซล Firebase ให้เปิดส่วนการ รับรองความถูกต้อง
- ในหน้าวิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานวิธีการลงชื่อเข้าใช้ด้วย หมายเลขโทรศัพท์
โควต้าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์ของ Firebase สูงพอที่แอปส่วนใหญ่จะไม่ได้รับผลกระทบ อย่างไรก็ตาม หากคุณต้องการลงชื่อเข้าใช้ผู้ใช้จำนวนมากด้วยการตรวจสอบสิทธิ์ทางโทรศัพท์ คุณอาจต้องอัปเกรดแผนราคาของคุณ ดูหน้า ราคา
เปิดใช้งานการยืนยันแอป
หากต้องการใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ Firebase จะต้องสามารถตรวจสอบได้ว่าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์นั้นมาจากแอปของคุณ การรับรองความถูกต้องของ Firebase ทำได้สองวิธี:
- SafetyNet : หากผู้ใช้มีอุปกรณ์ที่ติดตั้งบริการ Google Play และ Firebase Authentication สามารถตรวจสอบอุปกรณ์ว่าถูกต้องด้วย Android SafetyNet การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สามารถดำเนินการต่อได้
- ใน Google Cloud Console ให้เปิดใช้งาน Android Device Verification (DEPRECATED) API สำหรับโครงการของคุณ ระบบจะใช้คีย์ Firebase API เริ่มต้น และต้องได้รับอนุญาตให้เข้าถึง DeviceCheck API
- หากคุณยังไม่ได้ระบุลายนิ้วมือ SHA-256 ของแอป ให้ระบุจาก หน้าการตั้งค่า ของคอนโซล Firebase โปรดดูที่การยืนยันตัวตน ไคลเอ็นต์ของคุณ สำหรับรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA-256 ของแอป
- การ ยืนยัน reCAPTCHA : ในกรณีที่ใช้ SafetyNet ไม่ได้ เช่น เมื่อผู้ใช้ไม่มีการสนับสนุนบริการ Google Play หรือเมื่อทดสอบแอปของคุณบนโปรแกรมจำลอง Firebase Authentication จะใช้การยืนยัน reCAPTCHA เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ทางโทรศัพท์ให้เสร็จสมบูรณ์ ความท้าทายของ reCAPTCHA สามารถทำได้โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย โปรดทราบว่าขั้นตอนนี้ต้องการให้ SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ ขั้นตอนนี้ยังกำหนดให้คีย์ API ของคุณไม่ถูกจำกัดหรืออยู่ในรายการที่อนุญาตสำหรับ "${PROJECT_NAME}.firebaseapp.com"
หากต้องการเปิดใช้งาน SafetyNet เพื่อใช้กับ Firebase Authentication:
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มต้นการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้พิมพ์หมายเลขโทรศัพท์ ข้อกำหนดทางกฎหมายแตกต่างกันไป แต่ตามแนวทางปฏิบัติที่ดีที่สุดและเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ของคุณ คุณควรแจ้งให้ผู้ใช้ทราบว่าหากพวกเขาใช้การลงชื่อเข้าใช้ทางโทรศัพท์ พวกเขาอาจได้รับข้อความ 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) // Activity (for callback binding) .setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks .build(); PhoneAuthProvider.verifyPhoneNumber(options);
วิธีการ
verifyPhoneNumber
คือการกลับเข้ามาใหม่: หากคุณเรียกใช้เมธอดหลายครั้ง เช่น ในเมธอดonStart
ของกิจกรรม วิธีการverifyPhoneNumber
จะไม่ส่ง SMS ครั้งที่สอง เว้นแต่คำขอดั้งเดิมจะหมดเวลาคุณสามารถใช้ลักษณะการทำงานนี้เพื่อดำเนินการลงชื่อเข้าใช้หมายเลขโทรศัพท์ต่อ หากแอปของคุณปิดก่อนที่ผู้ใช้จะสามารถลงชื่อเข้าใช้ได้ (เช่น ในขณะที่ผู้ใช้กำลังใช้แอป SMS) หลังจากที่คุณโทรไปที่
verifyPhoneNumber
แล้ว ให้ตั้งค่าสถานะที่ระบุว่าการยืนยันกำลังดำเนินการอยู่ จากนั้น บันทึกแฟล็กในเมธอดonSaveInstanceState
ของกิจกรรม และกู้คืนแฟล็กในonRestoreInstanceState
สุดท้าย ในเมธอดonStart
ของกิจกรรมของคุณ ให้ตรวจสอบว่าการยืนยันกำลังดำเนินการอยู่หรือไม่ และถ้าใช่ ให้โทรไปverifyPhoneNumber
อีกครั้ง อย่าลืมล้างค่าสถานะเมื่อการยืนยันเสร็จสิ้นหรือล้มเหลว (ดู การเรียกกลับการยืนยัน )หากต้องการจัดการการหมุนหน้าจอและการรีสตาร์ทกิจกรรมอื่นๆ ให้ส่งกิจกรรมของคุณไปยัง
verifyPhoneNumber
การยืนยันหมายเลขโทรศัพท์ การโทรกลับจะแยกออกโดยอัตโนมัติเมื่อกิจกรรมหยุดลง ดังนั้นคุณจึงสามารถเขียนโค้ดเปลี่ยน UI ได้อย่างอิสระในวิธีการโทรกลับข้อความ SMS ที่ส่งโดย Firebase สามารถแปลเป็นภาษาท้องถิ่นได้ด้วยการระบุภาษารับรองความถูกต้องผ่านเมธอด
setLanguageCode
บนอินสแตนซ์การตรวจสอบสิทธิ์ของคุณ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 } // 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 } // 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
ขึ้นอยู่กับข้อกำหนดของแอปของคุณเมื่อการยืนยันเสร็จสมบูรณ์ (PhoneAuthCredential)
วิธีนี้เรียกในสองสถานการณ์:
- การยืนยันทันที: ในบางกรณีสามารถยืนยันหมายเลขโทรศัพท์ได้ทันทีโดยไม่จำเป็นต้องส่งหรือป้อนรหัสยืนยัน
- ดึงข้อมูลอัตโนมัติ: ในอุปกรณ์บางเครื่อง บริการ Google Play สามารถตรวจจับ SMS ยืนยันที่เข้ามาโดยอัตโนมัติและดำเนินการยืนยันโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ (ความสามารถนี้อาจใช้ไม่ได้กับผู้ให้บริการบางราย) ซึ่งใช้ SMS Retriever API ซึ่งมีแฮชอักขระ 11 ตัวต่อท้ายข้อความ SMS
PhoneAuthCredential
ที่ส่งผ่านไปยังการโทรกลับเพื่อ ลงชื่อเข้าใช้ผู้ใช้เมื่อการยืนยันล้มเหลว (FirebaseException)
วิธีการนี้เรียกว่าเพื่อตอบสนองคำขอการยืนยันที่ไม่ถูกต้อง เช่น คำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent (รหัสการตรวจสอบสตริง, PhoneAuthProvider.ForceResendingToken)
ไม่จำเป็น. วิธีนี้เรียกหลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ให้ไว้
เมื่อเรียกวิธีนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกัน การยืนยันอัตโนมัติอาจดำเนินการอยู่เบื้องหลัง) จากนั้น หลังจากที่ผู้ใช้พิมพ์รหัสการตรวจสอบ คุณสามารถใช้รหัสการตรวจสอบและรหัสการตรวจสอบที่ส่งผ่านไปยังเมธอดเพื่อสร้างวัตถุ
PhoneAuthCredential
ซึ่ง คุณสามารถใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ อย่างไรก็ตาม บางแอปอาจรอจนกว่าจะมีการเรียกonCodeAutoRetrievalTimeOut
ก่อนจึงจะแสดง UI รหัสยืนยัน (ไม่แนะนำ)onCodeAutoRetrievalTimeOut (รหัสการยืนยันสตริง)
ไม่จำเป็น. เมธอดนี้ถูกเรียกหลังจากหมดเวลาที่ระบุเพื่อ
verifyPhoneNumber
ผ่านไปแล้วโดยไม่มีการทริกเกอร์onVerificationCompleted
ก่อน บนอุปกรณ์ที่ไม่มีซิมการ์ด วิธีนี้จะเรียกทันทีเนื่องจากไม่สามารถดึง SMS อัตโนมัติได้แอพบางตัวบล็อกการป้อนข้อมูลของผู้ใช้จนกว่าจะหมดเวลาการยืนยันอัตโนมัติ จากนั้นจึงแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS เท่านั้น (ไม่แนะนำ)
สร้างวัตถุ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้ ให้สร้างออบเจกต์
PhoneAuthCredential
โดยใช้รหัสยืนยันและรหัสยืนยันที่ส่งผ่านไปยังการโทรกลับ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
- เขียนการทดสอบการรวมระบบโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัย ซึ่งโดยปกติจะใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมที่ใช้งานจริง
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้:
- ตรวจสอบว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นจริงๆ และไม่มีอยู่แล้ว การตรวจสอบสิทธิ์ของ Firebase ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้หมายเลขนำหน้า 555 เป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา เช่น +1 650-555-3434
- หมายเลขโทรศัพท์ต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและข้อจำกัดอื่นๆ พวกเขาจะยังคงผ่านการตรวจสอบเช่นเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณสามารถเพิ่มหมายเลขโทรศัพท์ได้สูงสุด 10 หมายเลขสำหรับการพัฒนา
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่คาดเดาได้ยากและเปลี่ยนบ่อยๆ
สร้างหมายเลขโทรศัพท์สมมติและรหัสยืนยัน
- ใน คอนโซล Firebase ให้เปิดส่วนการ รับรองความถูกต้อง
- ในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการโทรศัพท์ หากคุณยังไม่ได้ดำเนินการ
- เปิด หมายเลขโทรศัพท์สำหรับทดสอบ เมนูหีบเพลง
- ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบ เช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขเฉพาะ เช่น 654321
- เพิ่ม หมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันของคุณได้โดยตรง การดำเนินการนี้ทำให้คุณสามารถดำเนินการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาโดยไม่เกิดปัญหาโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องติดตั้งบริการ Google Play
เมื่อคุณระบุหมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง แต่คุณต้องระบุรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้เพื่อดำเนินการลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
เมื่อลงชื่อเข้าใช้เสร็จสิ้น ระบบจะสร้างผู้ใช้ Firebase ด้วยหมายเลขโทรศัพท์นั้น ผู้ใช้มีลักษณะการทำงานและคุณสมบัติเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึงฐานข้อมูลเรียลไทม์/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();
การโทรยืนยันหมายเลขโทรศัพท์ด้วยหมายเลขสมมติจะทริกเกอร์การ
onCodeSent
verifyPhoneNumber
คุณจะต้องระบุรหัสยืนยันที่เกี่ยวข้อง สิ่งนี้ทำให้สามารถทดสอบใน Android EmulatorsJava
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 Store
Java
// The test phone number and code should be whitelisted in the console. String phoneNumber = "+16505554567"; String smsCode = "123456"; FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings(); // Configure faking the auto-retrieval with the whitelisted numbers. firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode); PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth) .setPhoneNumber(phoneNumber) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { @Override public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) { // Instant verification is applied and a credential is directly returned. // ... } // ... }) .build(); PhoneAuthProvider.verifyPhoneNumber(options);
Kotlin+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 คุณสามารถรับ ID ผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
ความถูกต้อง และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย เชื่อมโยงข้อมูลประจำตัวของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
ในการออกจากระบบผู้ใช้ โทร
signOut
:,Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่อยู่ในข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปของคุณคือการใช้ FirebaseUI ซึ่งมีวิดเจ็ตการลงชื่อเข้าใช้แบบดรอปอินที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ตลอดจนการลงชื่อเข้าใช้ด้วยรหัสผ่านและแบบรวมศูนย์ -ใน. เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนที่คุณจะเริ่มต้น
- หากคุณยังไม่ได้ดำเนินการ ให้ เพิ่ม Firebase ในโครงการ Android ของคุณ
- ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ
<project>/<app-module>/build.gradle
) ให้เพิ่มการพึ่งพาสำหรับไลบรารี Firebase Authentication Android ขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมการกำหนดเวอร์ชันของไลบรารีKotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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-ktx' }
เมื่อใช้ 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-ktx:21.1.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.3') // 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:21.1.0' }
- หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจาก คอนโซล Firebase
- หากคุณยังไม่ได้ตั้งค่าแฮช SHA-1 ของแอปใน คอนโซล Firebase ให้ดำเนินการดังกล่าว ดูการ ตรวจสอบสิทธิ์ไคลเอ็นต์ของคุณ สำหรับข้อมูลเกี่ยวกับการค้นหาแฮช SHA-1 ของแอป
ข้อกังวลด้านความปลอดภัย
การพิสูจน์ตัวตนโดยใช้เพียงหมายเลขโทรศัพท์นั้นสะดวก แต่มีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มี เนื่องจากสามารถโอนหมายเลขโทรศัพท์ระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ บนอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่สามารถรับข้อความ SMS ได้สามารถลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์
หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอปของคุณ คุณควรนำเสนอควบคู่ไปกับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยมากขึ้น และแจ้งให้ผู้ใช้ทราบถึงข้อเสียด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้งานการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโครงการ Firebase ของคุณ
ในการลงชื่อเข้าใช้ผู้ใช้ด้วย SMS คุณต้องเปิดใช้งานวิธีการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ของคุณก่อน:
- ใน คอนโซล Firebase ให้เปิดส่วนการ รับรองความถูกต้อง
- ในหน้าวิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานวิธีการลงชื่อเข้าใช้ด้วย หมายเลขโทรศัพท์
โควต้าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์ของ Firebase สูงพอที่แอปส่วนใหญ่จะไม่ได้รับผลกระทบ อย่างไรก็ตาม หากคุณต้องการลงชื่อเข้าใช้ผู้ใช้จำนวนมากด้วยการตรวจสอบสิทธิ์ทางโทรศัพท์ คุณอาจต้องอัปเกรดแผนราคาของคุณ ดูหน้า ราคา
เปิดใช้งานการยืนยันแอป
หากต้องการใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ Firebase จะต้องสามารถตรวจสอบได้ว่าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์นั้นมาจากแอปของคุณ การรับรองความถูกต้องของ Firebase ทำได้สองวิธี:
- SafetyNet : หากผู้ใช้มีอุปกรณ์ที่ติดตั้งบริการ Google Play และ Firebase Authentication สามารถตรวจสอบอุปกรณ์ว่าถูกต้องด้วย Android SafetyNet การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สามารถดำเนินการต่อได้
- ใน Google Cloud Console ให้เปิดใช้งาน Android Device Verification (DEPRECATED) API สำหรับโครงการของคุณ ระบบจะใช้คีย์ Firebase API เริ่มต้น และต้องได้รับอนุญาตให้เข้าถึง DeviceCheck API
- หากคุณยังไม่ได้ระบุลายนิ้วมือ SHA-256 ของแอป ให้ระบุจาก หน้าการตั้งค่า ของคอนโซล Firebase โปรดดูที่การยืนยันตัวตน ไคลเอ็นต์ของคุณ สำหรับรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA-256 ของแอป
- การ ยืนยัน reCAPTCHA : ในกรณีที่ใช้ SafetyNet ไม่ได้ เช่น เมื่อผู้ใช้ไม่มีการสนับสนุนบริการ Google Play หรือเมื่อทดสอบแอปของคุณบนโปรแกรมจำลอง Firebase Authentication จะใช้การยืนยัน reCAPTCHA เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ทางโทรศัพท์ให้เสร็จสมบูรณ์ ความท้าทายของ reCAPTCHA สามารถทำได้โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย โปรดทราบว่าขั้นตอนนี้ต้องการให้ SHA-1 เชื่อมโยงกับแอปพลิเคชันของคุณ ขั้นตอนนี้ยังกำหนดให้คีย์ API ของคุณไม่ถูกจำกัดหรืออยู่ในรายการที่อนุญาตสำหรับ "${PROJECT_NAME}.firebaseapp.com"
หากต้องการเปิดใช้งาน SafetyNet เพื่อใช้กับ Firebase Authentication:
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มต้นการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้พิมพ์หมายเลขโทรศัพท์ ข้อกำหนดทางกฎหมายแตกต่างกันไป แต่ตามแนวทางปฏิบัติที่ดีที่สุดและเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ของคุณ คุณควรแจ้งให้ผู้ใช้ทราบว่าหากพวกเขาใช้การลงชื่อเข้าใช้ทางโทรศัพท์ พวกเขาอาจได้รับข้อความ 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) // Activity (for callback binding) .setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks .build(); PhoneAuthProvider.verifyPhoneNumber(options);
วิธีการ
verifyPhoneNumber
คือการกลับเข้ามาใหม่: หากคุณเรียกใช้เมธอดหลายครั้ง เช่น ในเมธอดonStart
ของกิจกรรม วิธีการverifyPhoneNumber
จะไม่ส่ง SMS ครั้งที่สอง เว้นแต่คำขอดั้งเดิมจะหมดเวลาคุณสามารถใช้ลักษณะการทำงานนี้เพื่อดำเนินการลงชื่อเข้าใช้หมายเลขโทรศัพท์ต่อ หากแอปของคุณปิดก่อนที่ผู้ใช้จะสามารถลงชื่อเข้าใช้ได้ (เช่น ในขณะที่ผู้ใช้กำลังใช้แอป SMS) หลังจากที่คุณโทรไปที่
verifyPhoneNumber
แล้ว ให้ตั้งค่าสถานะที่ระบุว่าการยืนยันกำลังดำเนินการอยู่ จากนั้น บันทึกแฟล็กในเมธอดonSaveInstanceState
ของกิจกรรม และกู้คืนแฟล็กในonRestoreInstanceState
สุดท้าย ในเมธอดonStart
ของกิจกรรมของคุณ ให้ตรวจสอบว่าการยืนยันกำลังดำเนินการอยู่หรือไม่ และถ้าใช่ ให้โทรไปverifyPhoneNumber
อีกครั้ง อย่าลืมล้างค่าสถานะเมื่อการยืนยันเสร็จสิ้นหรือล้มเหลว (ดู การเรียกกลับการยืนยัน )หากต้องการจัดการการหมุนหน้าจอและการรีสตาร์ทกิจกรรมอื่นๆ ให้ส่งกิจกรรมของคุณไปยัง
verifyPhoneNumber
การยืนยันหมายเลขโทรศัพท์ การโทรกลับจะแยกออกโดยอัตโนมัติเมื่อกิจกรรมหยุดลง ดังนั้นคุณจึงสามารถเขียนโค้ดเปลี่ยน UI ได้อย่างอิสระในวิธีการโทรกลับข้อความ SMS ที่ส่งโดย Firebase สามารถแปลเป็นภาษาท้องถิ่นได้ด้วยการระบุภาษารับรองความถูกต้องผ่านเมธอด
setLanguageCode
บนอินสแตนซ์การตรวจสอบสิทธิ์ของคุณ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 } // 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 } // 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
ขึ้นอยู่กับข้อกำหนดของแอปของคุณเมื่อการยืนยันเสร็จสมบูรณ์ (PhoneAuthCredential)
วิธีนี้เรียกในสองสถานการณ์:
- การยืนยันทันที: ในบางกรณีสามารถยืนยันหมายเลขโทรศัพท์ได้ทันทีโดยไม่จำเป็นต้องส่งหรือป้อนรหัสยืนยัน
- ดึงข้อมูลอัตโนมัติ: ในอุปกรณ์บางเครื่อง บริการ Google Play สามารถตรวจจับ SMS ยืนยันที่เข้ามาโดยอัตโนมัติและดำเนินการยืนยันโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ (ความสามารถนี้อาจใช้ไม่ได้กับผู้ให้บริการบางราย) ซึ่งใช้ SMS Retriever API ซึ่งมีแฮชอักขระ 11 ตัวต่อท้ายข้อความ SMS
PhoneAuthCredential
ที่ส่งผ่านไปยังการโทรกลับเพื่อ ลงชื่อเข้าใช้ผู้ใช้เมื่อการยืนยันล้มเหลว (FirebaseException)
วิธีการนี้เรียกว่าเพื่อตอบสนองคำขอการยืนยันที่ไม่ถูกต้อง เช่น คำขอที่ระบุหมายเลขโทรศัพท์หรือรหัสยืนยันที่ไม่ถูกต้อง
onCodeSent (รหัสการตรวจสอบสตริง, PhoneAuthProvider.ForceResendingToken)
ไม่จำเป็น. วิธีนี้เรียกหลังจากส่งรหัสยืนยันทาง SMS ไปยังหมายเลขโทรศัพท์ที่ให้ไว้
เมื่อเรียกวิธีนี้ แอปส่วนใหญ่จะแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS (ในขณะเดียวกัน การยืนยันอัตโนมัติอาจดำเนินการอยู่เบื้องหลัง) จากนั้น หลังจากที่ผู้ใช้พิมพ์รหัสการตรวจสอบ คุณสามารถใช้รหัสการตรวจสอบและรหัสการตรวจสอบที่ส่งผ่านไปยังเมธอดเพื่อสร้างวัตถุ
PhoneAuthCredential
ซึ่ง คุณสามารถใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ อย่างไรก็ตาม บางแอปอาจรอจนกว่าจะมีการเรียกonCodeAutoRetrievalTimeOut
ก่อนจึงจะแสดง UI รหัสยืนยัน (ไม่แนะนำ)onCodeAutoRetrievalTimeOut (รหัสการยืนยันสตริง)
ไม่จำเป็น. เมธอดนี้ถูกเรียกหลังจากหมดเวลาที่ระบุเพื่อ
verifyPhoneNumber
ผ่านไปแล้วโดยไม่มีการทริกเกอร์onVerificationCompleted
ก่อน บนอุปกรณ์ที่ไม่มีซิมการ์ด วิธีนี้จะเรียกทันทีเนื่องจากไม่สามารถดึง SMS อัตโนมัติได้แอพบางตัวบล็อกการป้อนข้อมูลของผู้ใช้จนกว่าจะหมดเวลาการยืนยันอัตโนมัติ จากนั้นจึงแสดง UI ที่แจ้งให้ผู้ใช้พิมพ์รหัสยืนยันจากข้อความ SMS เท่านั้น (ไม่แนะนำ)
สร้างวัตถุ PhoneAuthCredential
หลังจากที่ผู้ใช้ป้อนรหัสยืนยันที่ Firebase ส่งไปยังโทรศัพท์ของผู้ใช้ ให้สร้างออบเจกต์
PhoneAuthCredential
โดยใช้รหัสยืนยันและรหัสยืนยันที่ส่งผ่านไปยังการโทรกลับ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
- เขียนการทดสอบการรวมระบบโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัย ซึ่งโดยปกติจะใช้กับหมายเลขโทรศัพท์จริงในสภาพแวดล้อมที่ใช้งานจริง
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้:
- ตรวจสอบว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นจริงๆ และไม่มีอยู่แล้ว การตรวจสอบสิทธิ์ของ Firebase ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้หมายเลขนำหน้า 555 เป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา เช่น +1 650-555-3434
- หมายเลขโทรศัพท์ต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและข้อจำกัดอื่นๆ พวกเขาจะยังคงผ่านการตรวจสอบเช่นเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณสามารถเพิ่มหมายเลขโทรศัพท์ได้สูงสุด 10 หมายเลขสำหรับการพัฒนา
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่คาดเดาได้ยากและเปลี่ยนบ่อยๆ
สร้างหมายเลขโทรศัพท์สมมติและรหัสยืนยัน
- ใน คอนโซล Firebase ให้เปิดส่วนการ รับรองความถูกต้อง
- ในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการโทรศัพท์ หากคุณยังไม่ได้ดำเนินการ
- เปิด หมายเลขโทรศัพท์สำหรับทดสอบ เมนูหีบเพลง
- ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบ เช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขเฉพาะ เช่น 654321
- เพิ่ม หมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันของคุณได้โดยตรง การดำเนินการนี้ทำให้คุณสามารถดำเนินการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาโดยไม่เกิดปัญหาโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องติดตั้งบริการ Google Play
เมื่อคุณระบุหมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง แต่คุณต้องระบุรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้เพื่อดำเนินการลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
เมื่อลงชื่อเข้าใช้เสร็จสิ้น ระบบจะสร้างผู้ใช้ Firebase ด้วยหมายเลขโทรศัพท์นั้น The user has the same behavior and properties as a real phone number user, and can access Realtime Database/Cloud Firestore and other services the same way. The ID token minted during this process has the same signature as a real phone number user.
Another option is to set a test role via custom claims on these users to differentiate them as fake users if you want to further restrict access.
To manually trigger the reCAPTCHA flow for testing, use the
forceRecaptchaFlowForTesting()
method.// Force reCAPTCHA flow FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();
Integration testing
In addition to manual testing, Firebase Authentication provides APIs to help write integration tests for phone auth testing. These APIs disable app verification by disabling the reCAPTCHA requirement in web and silent push notifications in iOS. This makes automation testing possible in these flows and easier to implement. In addition, they help provide the ability to test instant verification flows on Android.
On Android, call
setAppVerificationDisabledForTesting()
before thesignInWithPhoneNumber
call. This disables app verification automatically, allowing you to pass the phone number without manually solving it. Note that even though reCAPTCHA and/or SafetyNet are disabled, using a real phone number will still fail to complete sign in. Only fictional phone numbers can be used with this API.// Turn off phone auth app verification. FirebaseAuth.getInstance().getFirebaseAuthSettings() .setAppVerificationDisabledForTesting();
Calling
verifyPhoneNumber
with a fictional number triggers theonCodeSent
callback, in which you'll need to provide the corresponding verification code. This allows testing in 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)
Additionally, you can test auto-retrieval flows in Android by setting the fictional number and its corresponding verification code for auto-retrieval by calling
setAutoRetrievedSmsCodeForPhoneNumber
.When
verifyPhoneNumber
is called, it triggersonVerificationCompleted
with thePhoneAuthCredential
directly. This works only with fictional phone numbers.Make sure this is disabled and no fictional phone numbers are hardcoded in your app when publishing your application to the Google Play store.
Java
// The test phone number and code should be whitelisted in the console. String phoneNumber = "+16505554567"; String smsCode = "123456"; FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings(); // Configure faking the auto-retrieval with the whitelisted numbers. firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode); PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth) .setPhoneNumber(phoneNumber) .setTimeout(60L, TimeUnit.SECONDS) .setActivity(this) .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { @Override public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) { // Instant verification is applied and a credential is directly returned. // ... } // ... }) .build(); PhoneAuthProvider.verifyPhoneNumber(options);
Kotlin+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)
Next steps
After a user signs in for the first time, a new user account is created and linked to the credentials—that is, the user name and password, phone number, or auth provider information—the user signed in with. This new account is stored as part of your Firebase project, and can be used to identify a user across every app in your project, regardless of how the user signs in.
In your apps, you can get the user's basic profile information from the
FirebaseUser
object. See Manage Users .In your Firebase Realtime Database and Cloud Storage Security Rules , you can get the signed-in user's unique user ID from the
auth
variable, and use it to control what data a user can access.
You can allow users to sign in to your app using multiple authentication providers by linking auth provider credentials to an existing user account.
To sign out a user, call
signOut
:Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
เนื้อหาของหน้าเว็บนี้ได้รับอนุญาตภายใต้ใบอนุญาตที่ต้องระบุที่มาของครีเอทีฟคอมมอนส์ 4.0 และตัวอย่างโค้ดได้รับอนุญาตภายใต้ใบอนุญาต Apache 2.0 เว้นแต่จะระบุไว้เป็นอย่างอื่น โปรดดูรายละเอียดที่นโยบายเว็บไซต์ Google Developers Java เป็นเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2023-03-05 UTC
[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"ไม่มีข้อมูลที่ฉันต้องการ" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป" },{ "type": "thumb-down", "id": "outOfDate", "label":"ล้าสมัย" },{ "type": "thumb-down", "id": "translationIssue", "label":"ปัญหาเกี่ยวกับการแปล" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด" },{ "type": "thumb-down", "id": "otherDown", "label":"อื่นๆ" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"เข้าใจง่าย" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"แก้ปัญหาของฉันได้" },{ "type": "thumb-up", "id": "otherUp", "label":"อื่นๆ" }]