Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

ก่อนจะเริ่ม

  1. เพิ่ม Firebase กับโครงการของคุณ C ++
  2. หากคุณยังไม่ได้เชื่อมต่อแอปของคุณให้กับโครงการ Firebase ของคุณทำเช่นนั้นจาก คอนโซล Firebase

บนแพลตฟอร์มของ Apple โปรดทราบว่าการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ต้องใช้อุปกรณ์จริงและจะไม่ทำงานบนเครื่องจำลอง

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

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

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

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

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

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

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

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

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

วิธีเปิดใช้งานการแจ้งเตือน APN สำหรับใช้กับการตรวจสอบสิทธิ์ Firebase:

  1. ใน Xcode, เปิดใช้งานการแจ้งเตือนผลักดัน สำหรับโครงการของคุณ
  2. อัปโหลดใบรับรอง APN ของคุณไปยัง Firebase หากคุณไม่ได้มีใบรับรอง APNs ให้แน่ใจว่าจะสร้างหนึ่งใน แอปเปิ้ลผู้พัฒนาศูนย์สมาชิก

    1. ภายในโครงการของคุณใน Firebase คอนโซลเลือกไอคอนรูปเฟืองเลือกการตั้งค่าโครงการแล้วเลือกแท็บ Messaging เมฆ

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

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

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

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

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

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

  2. โทร PhoneAuthProvider::VerifyPhoneNumber ผ่านไปหมายเลขโทรศัพท์ของผู้ใช้
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential 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;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    เมื่อคุณเรียก PhoneAuthProvider::VerifyPhoneNumber , Firebase,
    • (บน iOS) ส่งการแจ้งเตือนแบบเงียบไปยังแอปของคุณ
    • ส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยังหมายเลขโทรศัพท์ที่ระบุและส่งรหัสยืนยันไปยังฟังก์ชันการกรอกของคุณ คุณจะต้องใช้ทั้งรหัสยืนยันและรหัสยืนยันเพื่อลงชื่อเข้าใช้ผู้ใช้
  3. บันทึกรหัสยืนยันและกู้คืนเมื่อแอปของคุณโหลด การทำเช่นนี้ช่วยให้มั่นใจได้ว่าคุณยังมีรหัสยืนยันที่ถูกต้อง หากแอปของคุณถูกยกเลิกก่อนที่ผู้ใช้จะทำตามขั้นตอนการลงชื่อเข้าใช้ให้เสร็จสิ้น (เช่น ขณะเปลี่ยนไปใช้แอป SMS)

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

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

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

เข้าสู่ระบบผู้ใช้ด้วยรหัสยืนยัน

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

  1. รับรหัสยืนยันจากผู้ใช้
  2. สร้าง Credential ของวัตถุจากรหัสยืนยันและรหัสการตรวจสอบ
    Credential 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.
            const 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 != nullptr) {
      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 เรียลไทม์และการจัดเก็บเมฆ กฎการรักษาความปลอดภัย , คุณจะได้รับการลงนามใน ID ผู้ใช้ของผู้ใช้ที่ไม่ซ้ำกันจาก auth ตัวแปรและใช้ในการควบคุมสิ่งที่ข้อมูลที่เข้าถึงผู้ใช้สามารถ

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

ออกจากระบบผู้ใช้โทร SignOut() :

auth->SignOut();