একটি ফোন নম্বর এবং C++ ব্যবহার করে Firebase দিয়ে প্রমাণীকরণ করুন

আপনি ব্যবহারকারীর ফোনে একটি এসএমএস বার্তা পাঠিয়ে Firebase Authentication ব্যবহার করে তাকে সাইন ইন করাতে পারেন। ব্যবহারকারী এসএমএস বার্তায় থাকা একটি ওয়ান-টাইম কোড ব্যবহার করে সাইন ইন করেন।

এই ডকুমেন্টে বর্ণনা করা হয়েছে কিভাবে Firebase SDK ব্যবহার করে একটি ফোন নম্বর সাইন-ইন ফ্লো বাস্তবায়ন করতে হয়।

শুরু করার আগে

  1. আপনার C++ প্রজেক্টে Firebase যোগ করুন
  2. আপনি যদি এখনও আপনার অ্যাপটিকে আপনার ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত না করে থাকেন, তাহলে Firebase কনসোল থেকে তা করে নিন।
  3. ফোন নম্বর দিয়ে সাইন-ইন করার জন্য প্ল্যাটফর্মের প্রয়োজনীয়তাগুলো বুঝুন:
    • ফোন নম্বর দিয়ে সাইন-ইন শুধুমাত্র মোবাইল প্ল্যাটফর্মের জন্য প্রযোজ্য।
    • iOS-এ, ফোন নম্বর দিয়ে সাইন-ইন করার জন্য একটি ফিজিক্যাল ডিভাইস প্রয়োজন হয় এবং এটি সিমুলেটরে কাজ করে না।

নিরাপত্তা উদ্বেগ

শুধুমাত্র ফোন নম্বর ব্যবহার করে প্রমাণীকরণ সুবিধাজনক হলেও, এটি অন্যান্য উপলব্ধ পদ্ধতির তুলনায় কম সুরক্ষিত, কারণ ব্যবহারকারীদের মধ্যে ফোন নম্বরের মালিকানা সহজেই হস্তান্তর করা যায়। এছাড়াও, একাধিক ব্যবহারকারী প্রোফাইলযুক্ত ডিভাইসগুলিতে, যে কোনো ব্যবহারকারী যিনি এসএমএস বার্তা গ্রহণ করতে পারেন, তিনি ডিভাইসটির ফোন নম্বর ব্যবহার করে একটি অ্যাকাউন্টে সাইন ইন করতে পারেন।

আপনার অ্যাপে যদি ফোন নম্বর ভিত্তিক সাইন-ইন ব্যবহার করেন, তবে আরও সুরক্ষিত সাইন-ইন পদ্ধতির পাশাপাশি এটিও উপলব্ধ রাখা উচিত এবং ফোন নম্বর ব্যবহার করে সাইন-ইন করার নিরাপত্তাগত সীমাবদ্ধতাগুলো সম্পর্কে ব্যবহারকারীদের অবহিত করা উচিত।

আপনার ফায়ারবেস প্রোজেক্টের জন্য ফোন নম্বর দিয়ে সাইন-ইন চালু করুন।

এসএমএস-এর মাধ্যমে ব্যবহারকারীদের সাইন ইন করাতে হলে, আপনাকে প্রথমে আপনার ফায়ারবেস প্রোজেক্টের জন্য ফোন নম্বর সাইন-ইন পদ্ধতিটি সক্রিয় করতে হবে:

  1. Firebase কনসোলে , Authentication সেকশনটি খুলুন।
  2. সাইন-ইন পদ্ধতি পেজে, ফোন নম্বর দিয়ে সাইন-ইন করার পদ্ধতিটি সক্রিয় করুন।
  3. সেটিংস পৃষ্ঠায়, আপনি কোন কোন অঞ্চলে এসএমএস বার্তা পাঠানোর অনুমতি দিতে বা অস্বীকার করতে চান, সে বিষয়ে একটি নীতি নির্ধারণ করুন। নতুন প্রোজেক্টের জন্য, ডিফল্ট নীতি অনুযায়ী কোনো অঞ্চলের অনুমতি নেই।

APNs বিজ্ঞপ্তি পেতে শুরু করুন (অ্যাপল প্ল্যাটফর্ম)

অ্যাপল প্ল্যাটফর্মে ফোন নম্বর অথেন্টিকেশন ব্যবহার করতে হলে, আপনার অ্যাপকে অবশ্যই ফায়ারবেস থেকে APNs নোটিফিকেশন গ্রহণ করতে সক্ষম হতে হবে। যখন আপনি কোনো ডিভাইসে প্রথমবারের মতো কোনো ব্যবহারকারীকে তার ফোন নম্বর দিয়ে সাইন ইন করান, তখন Firebase Authentication ডিভাইসটিতে একটি সাইলেন্ট পুশ নোটিফিকেশন পাঠায় এটা যাচাই করার জন্য যে, ফোন নম্বর দিয়ে সাইন-ইন করার অনুরোধটি আপনার অ্যাপ থেকেই এসেছে। (এই কারণে, সিমুলেটরে ফোন নম্বর দিয়ে সাইন-ইন ব্যবহার করা যায় না।)

Firebase Authentication সাথে ব্যবহারের জন্য APNs নোটিফিকেশন সক্রিয় করতে:

  1. Xcode-এ আপনার প্রোজেক্টের জন্য পুশ নোটিফিকেশন চালু করুন
  2. আপনার APNs সার্টিফিকেটটি Firebase-এ আপলোড করুন। যদি আপনার আগে থেকে কোনো APNs সার্টিফিকেট না থাকে, তবে Apple Developer Member Center থেকে একটি তৈরি করে নিন।

    1. Firebase কনসোলে, এখানে যান > সাধারণ-এ যান তারপর, ক্লাউড মেসেজিং ট্যাবে ক্লিক করুন।
    2. আপনার ডেভেলপমেন্ট সার্টিফিকেট, প্রোডাকশন সার্টিফিকেট অথবা উভয়টির জন্য 'আপলোড সার্টিফিকেট'- এ ক্লিক করুন। এর মধ্যে অন্তত একটি থাকা আবশ্যক।
    3. প্রতিটি সার্টিফিকেটের জন্য .p12 ফাইলটি নির্বাচন করুন এবং পাসওয়ার্ড (যদি থাকে) প্রদান করুন। নিশ্চিত করুন যে এই সার্টিফিকেটের বান্ডেল আইডি আপনার অ্যাপের বান্ডেল আইডির সাথে মেলে। সেভ-এ ক্লিক করুন।

ব্যবহারকারীর ফোনে একটি যাচাইকরণ কোড পাঠান

ফোন নম্বর দিয়ে সাইন-ইন শুরু করতে, ব্যবহারকারীকে এমন একটি ইন্টারফেস দেখান যেখানে তাদের ফোন নম্বর দিতে বলা হবে, এবং তারপরে Firebase-কে ব্যবহারকারীর ফোনে SMS-এর মাধ্যমে একটি অথেনটিকেশন কোড পাঠানোর অনুরোধ জানাতে PhoneAuthProvider::VerifyPhoneNumber কল করুন:

  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);
    যখন আপনি Firebase-এ PhoneAuthProvider::VerifyPhoneNumber কল করেন,
    • (iOS-এ) আপনার অ্যাপে একটি সাইলেন্ট পুশ নোটিফিকেশন পাঠায়,
    • নির্দিষ্ট ফোন নম্বরে একটি প্রমাণীকরণ কোডসহ এসএমএস বার্তা পাঠায় এবং আপনার কমপ্লিশন ফাংশনে একটি ভেরিফিকেশন আইডি প্রেরণ করে। ব্যবহারকারীকে সাইন ইন করার জন্য আপনার ভেরিফিকেশন কোড এবং ভেরিফিকেশন আইডি উভয়ই প্রয়োজন হবে।
  3. ভেরিফিকেশন আইডিটি সংরক্ষণ করুন এবং আপনার অ্যাপ লোড হওয়ার সময় এটি পুনরুদ্ধার করুন। এর মাধ্যমে, আপনি নিশ্চিত করতে পারবেন যে ব্যবহারকারী সাইন-ইন প্রক্রিয়াটি সম্পূর্ণ করার আগেই যদি আপনার অ্যাপ বন্ধ হয়ে যায় (উদাহরণস্বরূপ, এসএমএস অ্যাপে যাওয়ার সময়), তাহলেও আপনার কাছে একটি বৈধ ভেরিফিকেশন আইডি থাকবে।

    আপনি আপনার ইচ্ছামতো ভেরিফিকেশন আইডিটি সংরক্ষণ করতে পারেন। আপনি যদি কোনো ক্রস-প্ল্যাটফর্ম C++ ফ্রেমওয়ার্ক ব্যবহার করে কোড লেখেন, তবে এটি অ্যাপ বন্ধ হওয়া এবং পুনরায় চালু হওয়ার জন্য নোটিফিকেশন দেবে। এই ইভেন্টগুলোতে, আপনি যথাক্রমে ভেরিফিকেশন আইডিটি সংরক্ষণ এবং পুনরুদ্ধার করতে পারবেন।

যদি VerifyPhoneNumber এ কল করার ফলে আপনার Listener-এ OnCodeSent কল হয়, তাহলে ব্যবহারকারী SMS বার্তায় ভেরিফিকেশন কোডটি পেলে আপনি তাকে সেটি টাইপ করতে বলতে পারেন।

অন্যদিকে, যদি 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::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 and Cloud Storage Security Rules- এ, আপনি auth ভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ইউজার আইডি পেতে পারেন এবং একজন ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারবে তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারেন।

বিদ্যমান কোনো ব্যবহারকারী অ্যাকাউন্টের সাথে অথেন্টিকেশন প্রোভাইডারের ক্রেডেনশিয়াল লিঙ্ক করার মাধ্যমে আপনি ব্যবহারকারীদের একাধিক অথেন্টিকেশন প্রোভাইডার ব্যবহার করে আপনার অ্যাপে সাইন ইন করার অনুমতি দিতে পারেন।

কোনো ব্যবহারকারীকে সাইন আউট করতে, SignOut() কল করুন:

auth->SignOut();