फ़ोन नंबर और C++ का इस्तेमाल करके, Firebase से पुष्टि करें

उपयोगकर्ता के फ़ोन पर एसएमएस भेजकर, उसे साइन इन करने के लिए Firebase Authentication का इस्तेमाल किया जा सकता है. उपयोगकर्ता, एसएमएस में मिले एक बार इस्तेमाल किए जा सकने वाले कोड का इस्तेमाल करके साइन इन करता है.

इस दस्तावेज़ में, Firebase SDK का इस्तेमाल करके, फ़ोन नंबर से साइन-इन करने की सुविधा लागू करने का तरीका बताया गया है.

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

  1. अपने C++ प्रोजेक्ट में Firebase जोड़ें.
  2. अगर आपने अब तक अपने ऐप्लिकेशन को Firebase प्रोजेक्ट से कनेक्ट नहीं किया है, तो Firebase कंसोल से कनेक्ट करें.
  3. फ़ोन नंबर से साइन इन करने के लिए, प्लैटफ़ॉर्म की ज़रूरी शर्तों के बारे में जानें:
    • फ़ोन नंबर से साइन इन करने की सुविधा, सिर्फ़ मोबाइल प्लैटफ़ॉर्म के लिए उपलब्ध है.
    • iOS पर, फ़ोन नंबर से साइन इन करने के लिए, किसी फ़िज़िकल डिवाइस की ज़रूरत होती है. यह सिम्युलेटर पर काम नहीं करेगा.

सुरक्षा से जुड़ी समस्याएं

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

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

अपने Firebase प्रोजेक्ट के लिए, फ़ोन नंबर से साइन-इन करने की सुविधा चालू करना

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

  1. Firebase कंसोल में, Authentication सेक्शन खोलें.
  2. साइन-इन करने का तरीका पेज पर, फ़ोन नंबर से साइन-इन करने का तरीका चालू करें.
  3. ज़रूरी नहीं: सेटिंग पेज पर, उन देशों/इलाकों के लिए नीति सेट करें जहां आपको एसएमएस भेजने की अनुमति देनी है या नहीं देनी है. एसएमएस भेजने के लिए देश/इलाके के हिसाब से नीति सेट करने से, आपके ऐप्लिकेशन को एसएमएस के गलत इस्तेमाल से बचाया जा सकता है.

APNs सूचनाएं (Apple प्लैटफ़ॉर्म) पाना शुरू करना

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

Firebase Authentication के साथ इस्तेमाल करने के लिए, APNs सूचनाएं पाने की सुविधा चालू करने के लिए:

  1. Xcode में, अपने प्रोजेक्ट के लिए पुश नोटिफ़िकेशन चालू करें.
  2. APNs सर्टिफ़िकेट को Firebase पर अपलोड करें. अगर आपके पास पहले से APNs सर्टिफ़िकेट नहीं है, तो Apple Developer Member Center में जाकर एक सर्टिफ़िकेट बनाएं.

    1. Firebase कंसोल में अपने प्रोजेक्ट में जाकर, गियर आइकॉन चुनें. इसके बाद, प्रोजेक्ट की सेटिंग चुनें. इसके बाद, Cloud Messaging टैब चुनें.

    2. अपने डेवलपमेंट सर्टिफ़िकेट, प्रोडक्शन सर्टिफ़िकेट या दोनों के लिए, सर्टिफ़िकेट अपलोड करें बटन चुनें. कम से कम एक इमेज होनी चाहिए.

    3. हर सर्टिफ़िकेट के लिए, .p12 फ़ाइल चुनें. अगर कोई पासवर्ड है, तो उसे डालें. पक्का करें कि इस सर्टिफ़िकेट का बंडल आईडी, आपके ऐप्लिकेशन के बंडल आईडी से मेल खाता हो. सेव करें को चुनें.

उपयोगकर्ता के फ़ोन पर पुष्टि करने के लिए कोड भेजना

फ़ोन नंबर से साइन इन करने की सुविधा शुरू करने के लिए, उपयोगकर्ता को एक ऐसा इंटरफ़ेस दिखाएं जिसमें उनसे अपना फ़ोन नंबर देने के लिए कहा गया हो. इसके बाद, PhoneAuthProvider::VerifyPhoneNumber को कॉल करके अनुरोध करें कि Firebase, उपयोगकर्ता के फ़ोन पर एसएमएस के ज़रिए पुष्टि करने का कोड भेजे:

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

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

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

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

अगर VerifyPhoneNumber को कॉल करने पर, OnCodeSent को आपके लिसनर पर कॉल मिलता है, तो उपयोगकर्ता को एसएमएस मैसेज में पुष्टि करने का कोड मिलने पर, उसे टाइप करने के लिए कहा जा सकता है.

दूसरी ओर, अगर VerifyPhoneNumber को कॉल करने पर OnVerificationCompleted मिलता है, तो इसका मतलब है कि अपने-आप पुष्टि होने की सुविधा काम कर गई है. अब आपको PhoneAuthCredential मिलेगा, जिसका इस्तेमाल नीचे दिए गए तरीके से किया जा सकता है.

पुष्टि करने के लिए मिले कोड का इस्तेमाल करके, उपयोगकर्ता को साइन इन करना

जब उपयोगकर्ता आपके ऐप्लिकेशन को एसएमएस से मिला पुष्टि करने का कोड दे, तब उसे साइन इन कराएं. इसके लिए, पुष्टि करने के कोड और पुष्टि करने के आईडी से 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 वैरिएबल से साइन इन किए हुए उपयोगकर्ता का यूनीक User-ID पाया जा सकता है. साथ ही, इसका इस्तेमाल यह कंट्रोल करने के लिए किया जा सकता है कि कोई उपयोगकर्ता किस डेटा को ऐक्सेस कर सकता है.

उपयोगकर्ताओं को पुष्टि करने वाले कई प्रोवाइडर का इस्तेमाल करके, आपके ऐप्लिकेशन में साइन इन करने की अनुमति दी जा सकती है. इसके लिए, पुष्टि करने वाले प्रोवाइडर के क्रेडेंशियल को किसी मौजूदा उपयोगकर्ता खाते से लिंक करें.

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

auth->SignOut();