คุณใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ให้ผู้ใช้ได้โดยการส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้โดยใช้รหัสแบบใช้ครั้งเดียวที่อยู่ในข้อความ SMS
เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนเริ่มต้น
- เพิ่ม Firebase ลงในโปรเจ็กต์ C++
- หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจากFirebase Console
- ทำความเข้าใจข้อกำหนดของแพลตฟอร์มสำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
- การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ใช้ได้กับแพลตฟอร์มอุปกรณ์เคลื่อนที่เท่านั้น
- ใน iOS การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ต้องใช้อุปกรณ์จริงและจะไม่ทำงานในโปรแกรมจำลอง
ข้อกังวลด้านความปลอดภัย
การตรวจสอบสิทธิ์โดยใช้หมายเลขโทรศัพท์เพียงอย่างเดียวอาจสะดวก แต่มีความปลอดภัยน้อยกว่าวิธีการอื่นๆ ที่มี เนื่องจากผู้ใช้สามารถโอนความเป็นเจ้าของหมายเลขโทรศัพท์ให้กันได้ง่าย นอกจากนี้ ในอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่รับข้อความ SMS ได้จะลงชื่อเข้าใช้บัญชีได้โดยใช้หมายเลขโทรศัพท์ของอุปกรณ์
หากใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอป คุณควรเสนอการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ควบคู่ไปกับวิธีการ��งชื่อเข้าใช้ที่ปลอดภัยยิ่งขึ้น และแจ้งให้ผู้ใช้ทราบถึงข้อแลกเปลี่ยนด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase
หากต้องการให้ผู้ใช้ลงชื่อเข้าใช้ทาง SMS คุณต้องเปิดใช้เมธอดลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ สำหรับโปรเจ็กต์ Firebase ก่อน โดยทำดังนี้
- ในFirebaseคอนโซล ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ด้วยโทรศัพท์
-
ตั้งค่านโยบายในภูมิภาคที่คุณต้องการอนุญาตหรือปฏิเสธ
การส่งข้อความ SMS การตั้งค่านโยบายภูมิภาค SMS จะช่วยปกป้องแอปของคุณจากการละเมิด SMS ได้
สำหรับโปรเจ็กต์ใหม่ นโยบายเริ่มต้นจะไม่อนุญาตภูมิภาคใดเลย
- ในFirebaseคอนโซล ให้ไปที่ ความปลอดภัย > การตรวจสอบสิทธิ์ > แท็บการตั้งค่า
- ในส่วนนโยบายเขต SMS ให้ตั้งค่านโยบายเขต SMS ของคุณ
เริ่มรับการแจ้งเตือน APNs (แพลตฟอร์ม Apple)
หากต้องการใช้การตรวจสอบสิทธิ์ด้วยหมายเลขโทรศัพท์ในแพลตฟอร์ม Apple แอปของคุณต้องรับการแจ้งเตือน APNs จาก Firebase ได้ เมื่อคุณลงชื่อเข้าใช้ผู้ใช้ด้วยหมายเลขโทรศัพท์เป็นครั้งแรกในอุปกรณ์ Firebase Authentication จะส่งการแจ้งเตือนแบบพุชเงียบไปยังอุปกรณ์เพื่อยืนยันว่าคำขอลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์มาจากแอปของคุณ (ด้วยเหตุนี้ จึงไม่สามารถใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในโปรแกรมจำลอง)
วิธีเปิดใช้การแจ้งเตือน APNs เพื่อใช้กับ Firebase Authentication
- ใน Xcode ให้ เปิดใช้ข้อความ Push สำหรับโปรเจ็กต์
อัปโหลดใบรับรอง APNs ไปยัง Firebase หากยังไม่มีใบรับรอง APNs โปรดสร้างใบรับรองใน Apple Developer Member Center
-
ในคอนโซล Firebase ให้ไปที่
การตั้งค่า > ทั่วไป จากนั้นคลิกแท็บ Cloud Messaging - คลิกอัปโหลดใบรับรองสำหรับใบรับรองการพัฒนา ใบรับรองเวอร์ชันที่ใช้งานจริง หรือทั้ง 2 อย่าง ต้องระบุอย่างน้อย 1 รายการ
-
สำหรับใบรับรองแต่ละรายการ ให้เลือกไฟล์
.p12และระบุรหัสผ่าน (หากมี) ตรวจสอบว่ารหัสชุดของใบรับรองนี้ตรงกับ รหัสชุดของแอป แล้วคลิกบันทึก
-
ในคอนโซล Firebase ให้ไปที่
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้ระบุหมายเลขโทรศัพท์ แล้วเรียกใช้ PhoneAuthProvider::VerifyPhoneNumber เพื่อขอให้ Firebase ส่งรหัสการตรวจสอบสิทธิ์ไปยังโทรศัพท์ของผู้ใช้ทาง SMS
-
รับหมายเลขโทรศัพท์ของผู้ใช้
ข้อกำหนดทางกฎหมายจะแตกต่างกันไป แต่แนวทางปฏิบัติแนะนำ และเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ คุณควรแจ้งให้ผู้ใช้ทราบว่าหากใช้ การลงชื่อเข้าใช้ด้วยโทรศัพท์ ผู้ใช้อาจได้รับข้อความ SMS สำหรับการยืนยันและระบบจะ คิดค่าบริการตามมาตรฐาน
- โทร
PhoneAuthProvider::VerifyPhoneNumberโดยส่งหมายเลขโทรศัพท์ของผู้ใช้ไปให้ เมื่อคุณเรียกใช้class PhoneListener : public PhoneAuthProvider::Listener { public: ~PhoneListener() override {} void OnVerificationCompleted(PhoneAuthCredential credential) override { // Auto-sms-retrieval or instant validation has succeeded (Android only). // No need for the user to input the verification code manually. // `credential` can be used instead of calling GetCredential(). } void OnVerificationFailed(const std::string& error) override { // Verification code not sent. } void OnCodeSent(const std::string& verification_id, const PhoneAuthProvider::ForceResendingToken& force_resending_token) override { // Verification code successfully sent via SMS. // Show the Screen to enter the Code. // Developer may want to save that verification_id along with other app states in case // the app is terminated before the user gets the SMS verification code. } }; PhoneListener phone_listener; PhoneAuhtOptions options; options.timeout_milliseconds = kAutoVerifyTimeOut; options.phone_number = phone_number; PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth); phone_provider->VerifyPhoneNumber(options, &phone_listener);
PhoneAuthProvider::VerifyPhoneNumber, Firebase,- (ใน iOS) จะส่งข้อความ Push แบบเงียบไปยังแอป
- จะส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยังหมายเลขโทรศัพท์ที่ระบุ และส่งรหัสยืนยันไปยังฟังก์ชันการดำเนินการให้เสร็จสมบูรณ์ คุณจะต้องใช้ทั้งรหัสยืนยันและรหัสยืนยันเพื่อ ลงชื่อเข้าใช้ผู้ใช้
-
บันทึกรหัสการยืนยันและกู้คืนเมื่อแอปโหลด การดำเนินการนี้จะช่วยให้คุณมั่นใจได้ว่าคุณจะยังมีรหัสยืนยันที่ถูกต้องหากแอปถูกสิ้นสุดก่อนที่ผู้ใช้จะลงชื่อเข้าใช้จนเสร็จสมบูรณ์ (เช่น ขณะเปลี่ยนไปใช้แอป SMS)
คุณจะเก็บรหัสการยืนยันด้วยวิธีใดก็ได้ หากคุณเขียน ด้วยเฟรมเวิร์ก C++ แบบข้ามแพลตฟอร์ม เฟรมเวิร์กนั้นควรมีการแจ้งเตือน การสิ้นสุดและการคืนค่าแอป ในเหตุการณ์เหล่านี้ คุณสามารถบันทึกและกู้คืน รหัสการยืนยันได้ตามลำดับ
หากการโทรไปยัง VerifyPhoneNumber ส่งผลให้มีการเรียกใช้ OnCodeSent
ใน Listener คุณสามารถแจ้งให้ผู้ใช้พิมพ์รหัสยืนยัน
เมื่อได้รับรหัสในข้อความ SMS
ในทางก��ับกัน หากการเรียกใช้ VerifyPhoneNumber ส่งผลให้เกิด
OnVerificationCompleted แสดงว่าการยืนยันอัตโนมัติสำเร็จ
และตอนนี้คุณจะมี PhoneAuthCredential ซึ่งคุณสามารถใช้ได้ตามที่อธิบายไว้
ด้านล่าง
ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน
หลังจากที่ผู้ใช้ให้รหัสยืนยันจากข้อความ SMS แก่แอปของคุณแล้ว ให้ลงชื่อเข้าใช้ผู้ใช้โดยสร้างออบเจ็กต์ PhoneAuthCredential
จากรหัสยืนยันและรหัสยืนยัน แล้วส่งออบเจ็กต์นั้น
ไปยัง Auth::SignInWithCredential
- รับรหัสยืนยันจากผู้ใช้
- สร้างออบเจ็กต์
Credentialจากรหัสยืนยันและ รหัสยืนยันPhoneAuthCredential credential = phone_auth_provider->GetCredential( verification_id_.c_str(), verification_code.c_str());
- ลงชื่อเข้าใช้ผู้ใช้ด้วยออบเจ็กต์
Credentialดังนี้Future<User> future = auth_->SignInWithCredential(credential); future.OnCompletion( [](const Future<User*>& result, void*) { if (result.error() == kAuthErrorNone) { // Successful. // User is signed in. User user = *result.result(); // This should display the phone number. printf("Phone number: %s", user.phone_number().c_str()); // The phone number provider UID is the phone number itself. printf("Phone provider uid: %s", user.uid().c_str()); // The phone number providerID is 'phone' printf("Phone provider ID: %s", user.provider_id().c_str()); } else { // Error. printf("Sign in error: %s", result.error_message().c_str()); } }, nullptr);
���ั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และ ลิงก์กับข้อมูลเข้าสู่ระบบที่ผู้ใช้ลงชื่อเข้าใช้ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุตัวตน ผู้ใช้ในทุกแอปในโปรเจ็กต์ได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
-
ในแอป คุณจะดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์
firebase::auth::Userfirebase::auth::User user = auth->current_user(); if (user.is_valid()) { std::string name = user.display_name(); std::string email = user.email(); std::string photo_url = user.photo_url(); // The user's ID, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, // if you have one. Use firebase::auth::User::Token() instead. std::string uid = user.uid(); }
ใน Firebase Realtime Database และ Cloud Storage กฎความปลอดภัย คุณสามารถ รับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
authและใช้รหัสดังกล่าวเพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายได้โดยลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการให้ผู้ใช้ออกจากระบบ ให้เรียกใช้
SignOut()
auth->SignOut();