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

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

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

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

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

सुरक्षा से जुड़ी चिंताएं

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

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

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

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

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

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

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

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

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

    1. Firebase कंसोल में, सेटिंग > सामान्य पर जाएं. इसके बाद, क्लाउड से मैसेज टैब पर क्लिक करें.
    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).
        // There's no need for the end user to input the verification code manually.
        // `credential` can't 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 वैरिएबल से पाया जा सकता है. साथ ही, इसका इस्तेमाल करके यह कंट्रोल किया जा सकता है कि उपयोगकर्ता कौनसा डेटा ऐक्सेस कर सकता है.

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

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

auth->SignOut();