คุณใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ผู้ใช้โดยการส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ได้ ผู้ใช้ลงชื่อเข้าใช้โดยใช้รหัสแบบใช้ครั้งเดียวที่อยู่ใน ข้อความ SMS
เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนเริ่มต้น
- เพิ่ม Firebase ในโปรเจ็กต์ C++
- หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ทําจากคอนโซล Firebase
- ทำความเข้าใจข้อกำหนดของแพลตฟอร์มสำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
- การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ใช้ได้กับแพลตฟอร์มอุปกรณ์เคลื่อนที่เท่านั้น
- ใน 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::Userได้firebase::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();