ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้หมายเลขโทรศัพท์และ C++

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

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

ก่อนเริ่มต้น

  1. เพิ่ม Firebase ไปยัง C++ โปรเจ็กต์
  2. หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก คอนโซล Firebase
  3. ทำความเข้าใจข้อกำหนดของแพลตฟอร์มสำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
    • การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์มีไว้สำหรับแพลตฟอร์มอุปกรณ์เคลื่อนที่เท่านั้น
    • ใน iOS การลงชื่อเข้าใช้หมายเลขโทรศัพท์ต้องใช้อุปกรณ์จริงและไม่สามารถใช้กับเครื่องจำลองได้

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

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

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

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

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

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

เริ่มรับการแจ้งเตือน APN (แพลตฟอร์มของ Apple)

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

หากต้องการเปิดใช้การแจ้งเตือน APN เพื่อใช้กับ Firebase Authentication ให้ทำดังนี้

  1. ใน Xcode เปิดใช้ข้อความ Push สําหรับโปรเจ็กต์
  2. อัปโหลดใบรับรอง APNs ไปยัง Firebase หากคุณยังไม่มีใบรับรอง APNs โปรดสร้างขึ้นใน Apple Developer Member Center

    1. ภายในโปรเจ็กต์ในคอนโซล Firebase ให้เลือก ไอคอนรูปเฟือง, เลือก การตั้งค่าโปรเจ็กต์ แล้วเลือก แท็บการรับส่งข้อความในระบบคลาวด์

    2. เลือกอัปโหลดใบรับรอง สำหรับใบรับรองการพัฒนา ใบรับรองการผลิต หรือทั้งสองอย่าง อย่างน้อย 1 รายการคือ ต้องระบุ

    3. สำหรับใบรับรองแต่ละรายการ ให้เลือกไฟล์ .p12 แล้วใส่ รหัสผ่าน (หากมี) ตรวจสอบว่ารหัสชุดสำหรับใบรับรองนี้ ตรงกับรหัสชุดของแอป เลือก บันทึก

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

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

  1. ดูหมายเลขโทรศัพท์ของผู้ใช้

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

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

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

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

ในทางกลับกัน หากการโทรหา VerifyPhoneNumber ส่งผลให้ OnVerificationCompleted การยืนยันอัตโนมัติสำเร็จแล้ว แล้วคุณจะมี PhoneAuthCredential ซึ่งคุณสามารถใช้ตามที่อธิบายไว้ ที่ด้านล่าง

ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน

หลังจากที่ผู้ใช้ให้รหัสยืนยันจาก SMS แก่แอปของคุณ ข้อความ โปรดลงชื่อเข้าใช้ให้ผู้ใช้ด้วยการสร้าง PhoneAuthCredential จากรหัสยืนยันและรหัสการยืนยัน และส่งผ่านออบเจ็กต์นั้น ไปยัง Auth::SignInWithCredential

  1. รับรหัสยืนยันจากผู้ใช้
  2. สร้างออบเจ็กต์ Credential จากรหัสยืนยันและ รหัสยืนยัน
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. ลงชื่อเข้าใช้ผู้ใช้ด้วยออบเจ็กต์ 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();