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

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

আপনার অ্যাপে ফোন নম্বর দিয়ে সাইন-ইন যুক্ত করার সবচেয়ে সহজ উপায় হলো FirebaseUI ব্যবহার করা, যার মধ্যে একটি ড্রপ-ইন সাইন-ইন উইজেট রয়েছে যা ফোন নম্বর দিয়ে সাইন-ইন, সেইসাথে পাসওয়ার্ড-ভিত্তিক এবং ফেডারেটেড সাইন-ইন-এর জন্য সাইন-ইন ফ্লো বাস্তবায়ন করে। এই ডকুমেন্টটিতে বর্ণনা করা হয়েছে কিভাবে Firebase SDK ব্যবহার করে একটি ফোন নম্বর সাইন-ইন ফ্লো বাস্তবায়ন করতে হয়।

শুরু করার আগে

  1. আপনি যদি এখনও আপনার অ্যাপটিকে আপনার ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত না করে থাকেন, তাহলে Firebase কনসোল থেকে তা করে নিন।
  2. ফায়ারবেস ডিপেন্ডেন্সিগুলো ইনস্টল ও পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

    1. Xcode-এ আপনার অ্যাপ প্রজেক্টটি খুলে, File > Add Packages- এ যান।
    2. অনুরোধ করা হলে, Firebase Apple প্ল্যাটফর্ম SDK রিপোজিটরিটি যোগ করুন:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Firebase Authentication লাইব্রেরিটি নির্বাচন করুন।
    5. আপনার টার্গেটের বিল্ড সেটিংসের ' Other Linker Flags' সেকশনে -ObjC ফ্ল্যাগটি যোগ করুন।
    6. কাজ শেষ হলে, Xcode স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ডে আপনার ডিপেন্ডেন্সিগুলো রিজলভ ও ডাউনলোড করা শুরু করবে।

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

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

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

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

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

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

অ্যাপ যাচাইকরণ সক্ষম করুন

ফোন নম্বর অথেন্টিকেশন ব্যবহার করার জন্য, ফায়ারবেসকে অবশ্যই যাচাই করতে সক্ষম হতে হবে যে ফোন নম্বর দিয়ে সাইন-ইন করার অনুরোধগুলো আপনার অ্যাপ থেকেই আসছে। Firebase Authentication দুটি উপায়ে এটি সম্পন্ন করে:

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

    iOS 8.0 এবং এর পরবর্তী সংস্করণগুলোতে, সাইলেন্ট নোটিফিকেশনের জন্য ব্যবহারকারীর সুস্পষ্ট সম্মতির প্রয়োজন হয় না এবং তাই ব্যবহারকারী অ্যাপে APNs নোটিফিকেশন গ্রহণ করতে অস্বীকৃতি জানালেও এটি প্রভাবিত হয় না। সুতরাং, Firebase ফোন নম্বর অথেন্টিকেশন প্রয়োগ করার সময় পুশ নোটিফিকেশন পাওয়ার জন্য অ্যাপটিকে ব্যবহারকারীর অনুমতি চাইতে হয় না।

  • reCAPTCHA ভেরিফিকেশন : যখন সাইলেন্ট পুশ নোটিফিকেশন পাঠানো বা গ্রহণ করা সম্ভব হয় না, যেমন ব্যবহারকারী আপনার অ্যাপের জন্য ব্যাকগ্রাউন্ড রিফ্রেশ বন্ধ করে রাখলে, অথবা যখন কোনো iOS সিমুলেটরে আপনার অ্যাপ পরীক্ষা করা হয়, তখন ফোন সাইন-ইন প্রক্রিয়াটি সম্পন্ন করার জন্য Firebase Authentication , reCAPTCHA ভেরিফিকেশন ব্যবহার করে। প্রায়শই ব্যবহারকারীকে কোনো কিছু সমাধান না করেই reCAPTCHA চ্যালেঞ্জটি সম্পন্ন করা যায়।

যখন সাইলেন্ট পুশ নোটিফিকেশন সঠিকভাবে কনফিগার করা থাকে, তখন খুব অল্প সংখ্যক ব্যবহারকারীই reCAPTCHA ফ্লো-এর সম্মুখীন হবেন। তথাপি, সাইলেন্ট পুশ নোটিফিকেশন চালু থাকুক বা না থাকুক, আপনার নিশ্চিত করা উচিত যে ফোন নম্বর দিয়ে সাইন-ইন সঠিকভাবে কাজ করছে।

নীরব বিজ্ঞপ্তি গ্রহণ করা শুরু করুন

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

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

    1. আপনার প্রোজেক্টের ভিতরে Firebase কনসোলে, গিয়ার আইকনটি নির্বাচন করুন, প্রোজেক্ট সেটিংস নির্বাচন করুন এবং তারপরে ক্লাউড মেসেজিং ট্যাবটি নির্বাচন করুন।

    2. iOS অ্যাপ কনফিগারেশনের অধীনে APNs অথেন্টিকেশন কী- তে, আপনার ডেভেলপমেন্ট অথেন্টিকেশন কী, অথবা প্রোডাকশন অথেন্টিকেশন কী, অথবা উভয়ই আপলোড করতে আপলোড বোতামে ক্লিক করুন। এর মধ্যে অন্তত একটি থাকা আবশ্যক।

    3. যেখানে আপনি আপনার কী (key) সংরক্ষণ করেছেন সেই অবস্থানে যান, সেটি নির্বাচন করুন এবং 'Open'-এ ক্লিক করুন। কী-টির জন্য কী আইডি (যা Apple Developer Member Center- এ পাওয়া যাবে) যোগ করুন এবং 'Upload'-এ ক্লিক করুন।

    আপনার কাছে যদি আগে থেকেই একটি APNs সার্টিফিকেট থাকে, তাহলে আপনি তার পরিবর্তে সার্টিফিকেটটি আপলোড করতে পারেন।

  3. Xcode-এ আপনার প্রোজেক্টের জন্য Background Modes ক্যাপাবিলিটিটি সক্রিয় করুন এবং তারপর Background fetchRemote notifications মোডগুলোর জন্য চেকবক্সগুলো নির্বাচন করুন।

reCAPTCHA যাচাইকরণ সেট আপ করুন

reCAPTCHA যাচাইকরণ ব্যবহার করার জন্য Firebase SDK সক্রিয় করতে:

  1. আপনার Xcode প্রোজেক্টে কাস্টম URL স্কিম যোগ করুন:
    1. আপনার প্রোজেক্ট কনফিগারেশন খুলুন: বাম দিকের ট্রি ভিউতে প্রোজেক্টের নামের উপর ডাবল-ক্লিক করুন। TARGETS সেকশন থেকে আপনার অ্যাপটি নির্বাচন করুন, তারপর Info ট্যাবটি নির্বাচন করুন এবং URL Types সেকশনটি এক্সপ্যান্ড করুন।
    2. + বোতামে ক্লিক করুন এবং আপনার এনকোডেড অ্যাপ আইডিটি ইউআরএল স্কিম হিসেবে যোগ করুন। আপনি আপনার এনকোডেড অ্যাপ আইডিটি ফায়ারবেস কনসোলের জেনারেল সেটিংস পৃষ্ঠার আইওএস অ্যাপ বিভাগে খুঁজে পাবেন। অন্যান্য ফিল্ডগুলো খালি রাখুন।

      সম্পূর্ণ হলে, আপনার কনফিগারেশনটি নিচের মতো দেখতে হবে (তবে এতে আপনার অ্যাপ্লিকেশনের জন্য নির্দিষ্ট মানগুলো থাকবে):

      এক্সকোডের কাস্টম ইউআরএল স্কিম সেটআপ ইন্টারফেসের স্ক্রিনশট
  2. ঐচ্ছিক : ব্যবহারকারীকে reCAPTCHA দেখানোর সময় আপনার অ্যাপ যেভাবে SFSafariViewController উপস্থাপন করে, তা যদি আপনি কাস্টমাইজ করতে চান, তাহলে AuthUIDelegate প্রোটোকল মেনে চলে এমন একটি কাস্টম ক্লাস তৈরি করুন এবং সেটি verifyPhoneNumber(_:uiDelegate:completion:) -এ পাস করুন।

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

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

  1. ব্যবহারকারীর ফোন নম্বরটি সংগ্রহ করুন।

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

  2. ব্যবহারকারীর ফোন নম্বরটি পাস করে verifyPhoneNumber(_:uiDelegate:completion:) কল করুন।

    সুইফট

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

    উদ্দেশ্য-সি

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    verifyPhoneNumber মেথডটি রিয়েন্ট্র্যান্ট: অর্থাৎ, যদি আপনি এটিকে একাধিকবার কল করেন, যেমন কোনো ভিউ-এর onAppear মেথডে, তাহলে মূল অনুরোধটির সময়সীমা শেষ না হওয়া পর্যন্ত verifyPhoneNumber মেথডটি দ্বিতীয় কোনো এসএমএস পাঠাবে না।

    যখন আপনি verifyPhoneNumber(_:uiDelegate:completion:) কল করেন, তখন Firebase আপনার অ্যাপে একটি সাইলেন্ট পুশ নোটিফিকেশন পাঠায়, অথবা ব্যবহারকারীকে একটি reCAPTCHA চ্যালেঞ্জ দেয়। আপনার অ্যাপ নোটিফিকেশনটি পাওয়ার পর বা ব্যবহারকারী reCAPTCHA চ্যালেঞ্জটি সম্পন্ন করার পর, Firebase নির্দিষ্ট ফোন নম্বরে একটি অথেনটিকেশন কোডসহ একটি SMS বার্তা পাঠায় এবং আপনার কমপ্লিশন ফাংশনে একটি ভেরিফিকেশন আইডি পাস করে। ব্যবহারকারীকে সাইন ইন করার জন্য আপনার ভেরিফিকেশন কোড এবং ভেরিফিকেশন আইডি উভয়েরই প্রয়োজন হবে।

    আপনার Auth ইনস্ট্যান্সের languageCode প্রপার্টির মাধ্যমে অথেন্টিকেশন ভাষা নির্দিষ্ট করে দিয়ে Firebase থেকে পাঠানো SMS মেসেজকেও স্থানীয়করণ করা যায়।

    সুইফট

     // Change language code to french.
     Auth.auth().languageCode = "fr";

    উদ্দেশ্য-সি

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
  3. ভেরিফিকেশন আইডিটি সংরক্ষণ করুন এবং আপনার অ্যাপ লোড হওয়ার সময় এটি পুনরুদ্ধার করুন। এর মাধ্যমে, আপনি নিশ্চিত করতে পারবেন যে ব্যবহারকারী সাইন-ইন প্রক্রিয়াটি সম্পূর্ণ করার আগেই যদি আপনার অ্যাপ বন্ধ হয়ে যায় (উদাহরণস্বরূপ, এসএমএস অ্যাপে যাওয়ার সময়), তাহলেও আপনার কাছে একটি বৈধ ভেরিফিকেশন আইডি থাকবে।

    আপনি আপনার ইচ্ছামতো ভেরিফিকেশন আইডিটি সংরক্ষণ করতে পারেন। একটি সহজ উপায় হলো NSUserDefaults অবজেক্টের সাথে ভেরিফিকেশন আইডিটি সংরক্ষণ করা:

    সুইফট

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")

    উদ্দেশ্য-সি

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];

    তারপর, আপনি সংরক্ষিত মানটি পুনরুদ্ধার করতে পারেন:

    সুইফট

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")

    উদ্দেশ্য-সি

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];

যদি verifyPhoneNumber(_:uiDelegate:completion:) কলটি সফল হয়, তাহলে ব্যবহারকারী এসএমএস বার্তায় যাচাইকরণ কোডটি পেলে আপনি তাকে সেটি টাইপ করতে বলতে পারেন।

যাচাইকরণ কোড দিয়ে ব্যবহারকারীকে সাইন ইন করান।

ব্যবহারকারী এসএমএস বার্তা থেকে আপনার অ্যাপকে ভেরিফিকেশন কোডটি দেওয়ার পর, সেই ভেরিফিকেশন কোড এবং ভেরিফিকেশন আইডি থেকে একটি FIRPhoneAuthCredential অবজেক্ট তৈরি করে এবং সেই অবজেক্টটি signInWithCredential:completion: -এ পাস করে ব্যবহারকারীকে সাইন ইন করুন।

  1. ব্যবহারকারীর কাছ থেকে যাচাইকরণ কোডটি নিন।
  2. ভেরিফিকেশন কোড এবং ভেরিফিকেশন আইডি থেকে একটি FIRPhoneAuthCredential অবজেক্ট তৈরি করুন।

    সুইফট

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    উদ্দেশ্য-সি

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. FIRPhoneAuthCredential অবজেক্ট ব্যবহার করে ব্যবহারকারীকে সাইন ইন করুন:

    সুইফট

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

    উদ্দেশ্য-সি

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

কাল্পনিক ফোন নম্বর দিয়ে পরীক্ষা করুন

আপনি Firebase কনসোলের মাধ্যমে ডেভেলপমেন্টের জন্য কাল্পনিক ফোন নম্বর সেট আপ করতে পারেন। কাল্পনিক ফোন নম্বর দিয়ে পরীক্ষা করার নিম্নলিখিত সুবিধাগুলো রয়েছে:

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

কাল্পনিক ফোন নম্বরগুলোকে অবশ্যই এই শর্তগুলো পূরণ করতে হবে:

  1. নিশ্চিত করুন যে আপনি এমন ফোন নম্বর ব্যবহার করছেন যা সত্যিই কাল্পনিক এবং আগে থেকে বিদ্যমান নয়। Firebase Authentication আপনাকে আসল ব্যবহারকারীদের ব্যবহৃত বিদ্যমান ফোন নম্বরগুলোকে টেস্ট নম্বর হিসেবে সেট করার অনুমতি দেয় না। একটি উপায় হলো মার্কিন টেস্ট ফোন নম্বর হিসেবে 555 প্রিফিক্সযুক্ত নম্বর ব্যবহার করা, যেমন: +1 650-555-3434
  2. ফোন নম্বরগুলোকে দৈর্ঘ্য এবং অন্যান্য সীমাবদ্ধতা মেনে সঠিকভাবে ফরম্যাট করতে হবে। তবুও এগুলো একজন প্রকৃত ব্যবহারকারীর ফোন নম্বরের মতোই একই যাচাইকরণ প্রক্রিয়ার মধ্য দিয়ে যাবে।
  3. উন্নয়নের জন্য আপনি সর্বোচ্চ ১০টি ফোন নম্বর যোগ করতে পারেন।
  4. এমন পরীক্ষামূলক ফোন নম্বর বা কোড ব্যবহার করুন যা অনুমান করা কঠিন এবং সেগুলো ঘন ঘন পরিবর্তন করুন।

কাল্পনিক ফোন নম্বর এবং যাচাইকরণ কোড তৈরি করুন

  1. Firebase কনসোলে , Authentication সেকশনটি খুলুন।
  2. সাইন ইন পদ্ধতি ট্যাবে, ফোন প্রদানকারীকে সক্রিয় করুন, যদি আগে থেকে তা করা না থাকে।
  3. পরীক্ষার জন্য ফোন নম্বরগুলোর অ্যাকর্ডিয়ন মেনুটি খুলুন।
  4. যে ফোন নম্বরটি পরীক্ষা করতে চান, সেটি দিন, যেমন: +1 650-555-3434
  5. ওই নির্দিষ্ট নম্বরটির জন্য ৬-সংখ্যার যাচাইকরণ কোডটি প্রদান করুন, উদাহরণস্বরূপ: ৬৫৪৩২১
  6. নম্বরটি যোগ করুন । প্রয়োজনে, সংশ্লিষ্ট সারির উপর মাউস রেখে ট্র্যাশ আইকনে ক্লিক করে ফোন নম্বর এবং এর কোডটি মুছে ফেলতে পারেন।

ম্যানুয়াল টেস্টিং

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

আপনি যখন কাল্পনিক ফোন নম্বরটি দিয়ে ভেরিফিকেশন কোড পাঠান, তখন কোনো প্রকৃত এসএমএস পাঠানো হয় না। এর পরিবর্তে, সাইন ইন সম্পন্ন করার জন্য আপনাকে পূর্বে সেট করা ভেরিফিকেশন কোডটি প্রদান করতে হবে।

সাইন-ইন সম্পন্ন হলে, সেই ফোন নম্বরটি দিয়ে একটি ফায়ারবেস ব্যবহারকারী তৈরি হয়। এই ব্যবহারকারীর আচরণ ও বৈশিষ্ট্য একজন আসল ফোন নম্বর ব্যবহারকারীর মতোই হয় এবং তিনি একইভাবে Realtime Database / Cloud Firestore ও অন্যান্য পরিষেবা অ্যাক্সেস করতে পারেন। এই প্রক্রিয়ার সময় তৈরি হওয়া আইডি টোকেনটির সিগনেচার একজন আসল ফোন নম্বর ব্যবহারকারীর সিগনেচারের মতোই হয়।

অ্যাক্সেস আরও সীমাবদ্ধ করতে চাইলে, এই ব্যবহারকারীদের নকল ব্যবহারকারী হিসেবে চিহ্নিত করার জন্য কাস্টম ক্লেইমের মাধ্যমে তাদের উপর একটি টেস্ট রোল সেট করা আরেকটি উপায়।

ইন্টিগ্রেশন টেস্টিং

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

iOS-এ, verifyPhoneNumber কল করার আগে appVerificationDisabledForTesting সেটিংটি অবশ্যই TRUE তে সেট করতে হবে। এটি কোনো APNs টোকেনের প্রয়োজন ছাড়াই বা ব্যাকগ্রাউন্ডে সাইলেন্ট পুশ নোটিফিকেশন না পাঠিয়েই সম্পন্ন হয়, ফলে সিমুলেটরে পরীক্ষা করা সহজ হয়। এটি reCAPTCHA ফলব্যাক ফ্লো-কেও নিষ্ক্রিয় করে দেয়।

মনে রাখবেন যে, অ্যাপ ভেরিফিকেশন নিষ্ক্রিয় থাকলে, আসল ফোন নম্বর ব্যবহার করে সাইন ইন করা যাবে না। এই API-এর সাথে শুধুমাত্র আসল ফোন নম্বরই ব্যবহার করা যাবে।

সুইফট

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = true
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if let error = error {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signIn(with: credential) { authResult, error in
      if let error = error {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authResult.user
    };
};

উদ্দেশ্য-সি

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

পরিশিষ্ট: সোয়াজলিং ছাড়া ফোন সাইন-ইন ব্যবহার

Firebase Authentication আপনার অ্যাপের APNs টোকেন স্বয়ংক্রিয়ভাবে সংগ্রহ করতে, Firebase থেকে আপনার অ্যাপে পাঠানো সাইলেন্ট পুশ নোটিফিকেশনগুলো পরিচালনা করতে, এবং ভেরিফিকেশনের সময় reCAPTCHA ভেরিফিকেশন পেজ থেকে কাস্টম স্কিম রিডাইরেক্ট স্বয়ংক্রিয়ভাবে ইন্টারসেপ্ট করতে মেথড সুইজলিং ব্যবহার করে।

আপনি যদি সুইজলিং ব্যবহার করতে না চান, তাহলে আপনার অ্যাপের Info.plist ফাইলে FirebaseAppDelegateProxyEnabled ফ্ল্যাগটি যোগ করে এবং এর মান NO সেট করে এটিকে নিষ্ক্রিয় করতে পারেন। মনে রাখবেন যে, এই ফ্ল্যাগটির মান NO সেট করলে Firebase Cloud Messaging সহ অন্যান্য Firebase প্রোডাক্টের জন্যও সুইজলিং নিষ্ক্রিয় হয়ে যায়।

আপনি যদি সুইজলিং নিষ্ক্রিয় করেন, তাহলে আপনাকে অবশ্যই Firebase Authentication -এ এপিএনএস ডিভাইস টোকেন, পুশ নোটিফিকেশন এবং কাস্টম স্কিম রিডাইরেক্ট ইউআরএল স্পষ্টভাবে পাস করতে হবে।

আপনি যদি একটি SwiftUI অ্যাপ্লিকেশন তৈরি করেন, তাহলে আপনার Firebase Authentication এ APNs ডিভাইস টোকেন, পুশ নোটিফিকেশন এবং কাস্টম স্কিম রিডাইরেক্ট URL-ও স্পষ্টভাবে পাস করা উচিত।

APNs ডিভাইস টোকেন পেতে, application(_:didRegisterForRemoteNotificationsWithDeviceToken:) মেথডটি ইমপ্লিমেন্ট করুন এবং এর মধ্যে Auth এর setAPNSToken(_:type:) মেথডে ডিভাইস টোকেনটি পাস করুন।

সুইফট

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .unknown)

  // Further handling of the device token if needed by the app
  // ...
}

উদ্দেশ্য-সি

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

পুশ নোটিফিকেশন পরিচালনা করতে, application(_:didReceiveRemoteNotification:fetchCompletionHandler:): মেথডের মধ্যে, Auth এর canHandleNotification(_:) মেথডটি কল করে Firebase auth সম্পর্কিত নোটিফিকেশনগুলো চেক করুন।

সুইফট

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

উদ্দেশ্য-সি

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

কাস্টম স্কিম রিডাইরেক্ট ইউআরএল পরিচালনা করতে, application(_:open:options:) মেথডটি ইমপ্লিমেন্ট করুন এবং এর মধ্যে Auth এর canHandleURL(_:) মেথডে ইউআরএলটি পাস করুন।

সুইফট

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

উদ্দেশ্য-সি

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

আপনি যদি SwiftUI বা UISceneDelegate ব্যবহার করেন, তাহলে রিডাইরেক্ট URL পরিচালনা করার জন্য scene(_:openURLContexts:) মেথডটি ইমপ্লিমেন্ট করুন এবং সেগুলোর মধ্যে Auth এর canHandleURL(_:) মেথডে URL-টি পাস করুন।

সুইফট

func scene(_ scene: UIScene, openURLContexts URLContexts: Set&ltUIOpenURLContext&gt) {
  for urlContext in URLContexts {
      let url = urlContext.url
      _ = Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

উদ্দেশ্য-সি

- (void)scene:(UIScene *)scene openURLContexts:(NSSet&ltUIOpenURLContext *&gt *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

পরবর্তী পদক্ষেপ

কোনো ব্যবহারকারী প্রথমবার সাইন ইন করার পর, একটি নতুন ব্যবহারকারী অ্যাকাউন্ট তৈরি হয় এবং সেটি ব্যবহারকারীর সাইন ইন করার ক্রেডেনশিয়াল—অর্থাৎ, ইউজার নেম ও পাসওয়ার্ড, ফোন নম্বর, বা অথোরাইজেশন প্রোভাইডারের তথ্যের—সাথে লিঙ্ক করা হয়। এই নতুন অ্যাকাউন্টটি আপনার ফায়ারবেস প্রজেক্টের অংশ হিসেবে সংরক্ষিত থাকে এবং ব্যবহারকারী কীভাবে সাইন ইন করছেন তা নির্বিশেষে, আপনার প্রজেক্টের প্রতিটি অ্যাপে তাকে শনাক্ত করতে এটি ব্যবহার করা যেতে পারে।

  • আপনার অ্যাপে, আপনি User অবজেক্ট থেকে ব্যবহারকারীর প্রাথমিক প্রোফাইল তথ্য পেতে পারেন। ব্যবহারকারী ব্যবস্থাপনা (Manage Users) দেখুন।

  • আপনার Firebase Realtime Database and Cloud Storage Security Rules- এ, আপনি auth ভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ইউজার আইডি পেতে পারেন এবং একজন ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারবে তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারেন।

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

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

সুইফট

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

উদ্দেশ্য-সি

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

আপনি সব ধরনের প্রমাণীকরণ ত্রুটির জন্য ত্রুটি পরিচালনা কোডও যোগ করতে চাইতে পারেন। ত্রুটি পরিচালনা দেখুন।