फ़ोन नंबर और C++ का उपयोग करके Firebase से प्रमाणित करें

आप उपयोगकर्ता के फ़ोन पर एक SMS संदेश भेजकर उपयोगकर्ता में साइन इन करने के लिए Firebase प्रमाणीकरण का उपयोग कर सकते हैं। उपयोगकर्ता एसएमएस संदेश में निहित वन-टाइम कोड का उपयोग करके साइन इन करता है।

यह दस्तावेज़ वर्णन करता है कि Firebase SDK का उपयोग करके फ़ोन नंबर साइन-इन प्रवाह को कैसे कार्यान्वित किया जाए।

शुरू करने से पहले

  1. अपने C++ प्रोजेक्ट में Firebase जोड़ें
  2. अगर आपने अभी तक अपने ऐप को अपने Firebase प्रोजेक्ट से कनेक्ट नहीं किया है, तो इसे Firebase कंसोल से करें।

Apple प्लेटफ़ॉर्म पर, ध्यान दें कि फ़ोन नंबर साइन-इन के लिए एक भौतिक डिवाइस की आवश्यकता होती है और यह सिम्युलेटर पर काम नहीं करेगा।

सुरक्षा चिंताएं

केवल एक फ़ोन नंबर का उपयोग करके प्रमाणीकरण, जबकि सुविधाजनक, अन्य उपलब्ध विधियों की तुलना में कम सुरक्षित है, क्योंकि फ़ोन नंबर का अधिकार उपयोगकर्ताओं के बीच आसानी से स्थानांतरित किया जा सकता है। साथ ही, एकाधिक उपयोगकर्ता प्रोफ़ाइल वाले डिवाइस पर, कोई भी उपयोगकर्ता जो SMS संदेश प्राप्त कर सकता है, डिवाइस के फ़ोन नंबर का उपयोग करके किसी खाते में साइन इन कर सकता है।

यदि आप अपने ऐप में फ़ोन नंबर आधारित साइन-इन का उपयोग करते हैं, तो आपको इसे अधिक सुरक्षित साइन-इन विधियों के साथ पेश करना चाहिए, और उपयोगकर्ताओं को फ़ोन नंबर साइन-इन का उपयोग करने के लिए सुरक्षा ट्रेडऑफ़ के बारे में सूचित करना चाहिए।

अपने Firebase प्रोजेक्ट के लिए फ़ोन नंबर साइन-इन सक्षम करें

SMS द्वारा उपयोगकर्ताओं में साइन इन करने के लिए, आपको पहले अपने Firebase प्रोजेक्ट के लिए फ़ोन नंबर साइन-इन विधि को सक्षम करना होगा:

  1. फायरबेस कंसोल में, प्रमाणीकरण अनुभाग खोलें।
  2. साइन-इन विधि पृष्ठ पर, फ़ोन नंबर साइन-इन विधि को सक्षम करें।

Firebase का फ़ोन नंबर साइन-इन अनुरोध कोटा इतना अधिक है कि अधिकांश ऐप्स प्रभावित नहीं होंगे। हालाँकि, यदि आपको फ़ोन प्रमाणीकरण के साथ बहुत अधिक मात्रा में उपयोगकर्ताओं में साइन इन करने की आवश्यकता है, तो आपको अपनी मूल्य निर्धारण योजना को अपग्रेड करने की आवश्यकता हो सकती है। मूल्य निर्धारण पृष्ठ देखें।

APN सूचनाएं प्राप्त करना प्रारंभ करें (Apple प्लेटफ़ॉर्म)

Apple प्लेटफ़ॉर्म पर फ़ोन नंबर प्रमाणीकरण का उपयोग करने के लिए, आपका ऐप Firebase से APN सूचनाएं प्राप्त करने में सक्षम होना चाहिए। जब आप किसी उपयोगकर्ता के फ़ोन नंबर के साथ डिवाइस पर पहली बार साइन इन करते हैं, तो Firebase प्रमाणीकरण डिवाइस को एक साइलेंट पुश नोटिफिकेशन भेजता है ताकि यह सत्यापित किया जा सके कि फ़ोन नंबर साइन-इन अनुरोध आपके ऐप से आता है। (इस कारण से, सिमुलेटर पर फ़ोन नंबर साइन-इन का उपयोग नहीं किया जा सकता है।)

Firebase प्रमाणीकरण के साथ उपयोग के लिए APN सूचनाओं को सक्षम करने के लिए:

  1. एक्सकोड में, अपने प्रोजेक्ट के लिए पुश नोटिफिकेशन सक्षम करें।
  2. अपने APN प्रमाणपत्र को Firebase पर अपलोड करें। यदि आपके पास पहले से APN प्रमाणपत्र नहीं है, तो Apple डेवलपर सदस्य केंद्र में एक प्रमाणपत्र बनाना सुनिश्चित करें।

    1. फायरबेस कंसोल में अपने प्रोजेक्ट के अंदर, गियर आइकन चुनें, प्रोजेक्ट सेटिंग्स चुनें और फिर क्लाउड मैसेजिंग टैब चुनें।

    2. अपने विकास प्रमाणपत्र, अपने उत्पादन प्रमाणपत्र, या दोनों के लिए प्रमाणपत्र अपलोड करें बटन का चयन करें। कम से कम एक की आवश्यकता है।

    3. प्रत्येक प्रमाणपत्र के लिए, .p12 फ़ाइल का चयन करें, और पासवर्ड प्रदान करें, यदि कोई हो। सुनिश्चित करें कि इस प्रमाणपत्र के लिए बंडल आईडी आपके ऐप की बंडल आईडी से मेल खाता है। सहेजें चुनें.

उपयोगकर्ता के फ़ोन पर सत्यापन कोड भेजें

फ़ोन नंबर साइन-इन आरंभ करने के लिए, उपयोगकर्ता को एक इंटरफ़ेस प्रस्तुत करें जो उन्हें अपना फ़ोन नंबर प्रदान करने के लिए प्रेरित करता है, और फिर PhoneAuthProvider::VerifyPhoneNumber पर कॉल करके अनुरोध करें कि Firebase उपयोगकर्ता के फ़ोन पर SMS द्वारा प्रमाणीकरण कोड भेजे:

  1. उपयोगकर्ता का फ़ोन नंबर प्राप्त करें।

    कानूनी आवश्यकताएं भिन्न होती हैं, लेकिन सर्वोत्तम अभ्यास के रूप में और अपने उपयोगकर्ताओं के लिए अपेक्षाएं निर्धारित करने के लिए, आपको उन्हें सूचित करना चाहिए कि यदि वे फ़ोन साइन-इन का उपयोग करते हैं, तो उन्हें सत्यापन के लिए एक एसएमएस संदेश प्राप्त हो सकता है और मानक दरें लागू हो सकती हैं।

  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 पर) आपके ऐप पर एक साइलेंट पुश नोटिफिकेशन भेजता है,
    • निर्दिष्ट फ़ोन नंबर पर एक प्रमाणीकरण कोड वाला एक एसएमएस संदेश भेजता है और आपके पूरा होने के कार्य के लिए एक सत्यापन आईडी पास करता है। उपयोगकर्ता में साइन इन करने के लिए आपको सत्यापन कोड और सत्यापन आईडी दोनों की आवश्यकता होगी।
  3. सत्यापन आईडी सहेजें और जब आपका ऐप लोड हो जाए तो उसे पुनर्स्थापित करें। ऐसा करने से, आप यह सुनिश्चित कर सकते हैं कि उपयोगकर्ता द्वारा साइन-इन प्रवाह पूरा करने से पहले (उदाहरण के लिए, एसएमएस ऐप पर स्विच करते समय) आपके ऐप को समाप्त कर दिया गया है, तो आपके पास अभी भी एक वैध सत्यापन आईडी है।

    आप किसी भी तरह से सत्यापन आईडी जारी रख सकते हैं। यदि आप क्रॉस-प्लेटफ़ॉर्म C++ फ्रेमवर्क के साथ लिख रहे हैं, तो उसे ऐप समाप्ति और बहाली के लिए सूचनाएं प्रदान करनी चाहिए। इन घटनाओं पर, आप क्रमशः सत्यापन आईडी को सहेज और पुनर्स्थापित कर सकते हैं।

यदि VerifyPhoneNumber पर कॉल करने के परिणामस्वरूप आपके श्रोता को OnCodeSent कॉल किया जाता है, तो आप उपयोगकर्ता को एसएमएस संदेश में सत्यापन कोड टाइप करने के लिए कह सकते हैं।

दूसरी ओर, यदि VerifyPhoneNumber पर कॉल का परिणाम OnVerificationCompleted है, तो स्वचालित सत्यापन सफल हो गया है और अब आपके पास एक Credential होगा जिसके साथ आप नीचे बताए अनुसार उपयोग कर सकते हैं।

सत्यापन कोड के साथ उपयोगकर्ता में साइन इन करें

उपयोगकर्ता द्वारा आपके ऐप को एसएमएस संदेश से सत्यापन कोड प्रदान करने के बाद, सत्यापन कोड और सत्यापन आईडी से एक 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::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();
    }
    
  • अपने फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप auth चर से साइन-इन किए गए उपयोगकर्ता की अद्वितीय उपयोगकर्ता आईडी प्राप्त कर सकते हैं, और इसका उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ता किस डेटा तक पहुंच सकता है।

आप प्रमाणीकरण प्रदाता क्रेडेंशियल्स को मौजूदा उपयोगकर्ता खाते से लिंक करके एकाधिक प्रमाणीकरण प्रदाताओं का उपयोग करके उपयोगकर्ताओं को अपने ऐप में साइन इन करने की अनुमति दे सकते हैं।

किसी उपयोगकर्ता को साइन आउट करने के लिए, SignOut() पर कॉल करें:

auth->SignOut();