ফোন নম্বর ব্যবহার করে Apple প্ল্যাটফর্মে Firebase-এর মাধ্যমে যাচাইকরণ

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

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

শুরু করার আগে

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

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

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

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

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

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

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

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

অ্যাপ যাচাইকরণ চালু করুন

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

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

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

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

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

সাইলেন্ট বিজ্ঞপ্তি পাওয়া শুরু করুন

Firebase Authentication-এর সাথে ব্যবহার করার জন্য APNs বিজ্ঞপ্তি চালু করতে:

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

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

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

  3. Xcode-এ, আপনার প্রোজেক্টের জন্য ব্যাকগ্রাউন্ড মোড সংক্রান্ত ক্ষমতা চালু করুন এবং তারপরে ব্যাকগ্রাউন্ড ফেচ ও রিমোট বিজ্ঞপ্তি মোডের জন্য চেকবক্স বেছে নিন।

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

reCAPTCHA যাচাইকরণ ব্যবহার করার জন্য Firebase SDK চালু করতে:

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

      আপনি Firebase কনসোলে আপনার এনকোড করা অ্যাপ আইডি খুঁজে পেতে পারেন: সেটিংস > সাধারণ ট্যাব-এ যান, তারপর আপনার iOS অ্যাপ সম্পর্কে বিবরণ দেখতে আপনার অ্যাপ বিভাগে নিচের দিকে স্ক্রল করুন।

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

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

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

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

  1. ব্যবহারকারীর ফোন নম্বর পান।

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

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

    Swift

    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
          // ...
      }

    Objective-C

    [[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 নির্দিষ্ট ফোন নম্বরে যাচাইকরণ কোড সহ একটি এসএমএস মেসেজ পাঠায় এবং আপনার সম্পূর্ণকরণ ফাংশনে একটি যাচাইকরণ আইডি পাঠায়। ব্যবহারকারীকে সাইন-ইন করাতে আপনার যাচাইকরণ কোড এবং যাচাইকরণ আইডি দুটিই লাগবে।

    Firebase-এর পাঠানো এসএমএস মেসেজও লোকালাইজ করা যেতে পারে। এর জন্য আপনার Auth ইনস্ট্যান্সে languageCode প্রপার্টির মাধ্যমে auth ভাষা নির্দিষ্ট করতে হবে।

    Swift

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

    Objective-C

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

    আপনি যেকোনও উপায়ে যাচাইকরণ আইডি সেভ করে রাখতে পারেন। একটি সহজ উপায় হল NSUserDefaults অবজেক্টের সাথে যাচাইকরণ আইডি সেভ করা:

    Swift

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

    Objective-C

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

    তারপর, আপনি সেভ করা ভ্যালু ফিরিয়ে আনতে পারবেন:

    Swift

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

    Objective-C

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

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

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

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

  1. ব্যবহারকারীর থেকে যাচাইকরণ কোড পান।
  2. যাচাইকরণ কোড ও যাচাইকরণ আইডি থেকে FIRPhoneAuthCredential অবজেক্ট তৈরি করুন।

    Swift

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

    Objective-C

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

    Swift

    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
        // ...
    }

    Objective-C

    [[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 কনসোল ব্যবহার করে ডেভেলপমেন্টের জন্য কাল্পনিক ফোন নম্বর সেট-আপ করতে পারেন। কাল্পনিক ফোন নম্বর দিয়ে পরীক্ষা করলে এইসব সুবিধা পাওয়া যায়:

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

কাল্পনিক ফোন নম্বরকে অবশ্যই এইসব প্রয়োজনীয়তা পূরণ করতে হবে:

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

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

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

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

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

আপনি কাল্পনিক ফোন নম্বর প্রদান করে যাচাইকরণ কোড পাঠালে, কোনও আসল এসএমএস পাঠানো হয় না। পরিবর্তে, সাইন-ইন সম্পূর্ণ করতে আপনাকে আগে থেকে কনফিগার করা যাচাইকরণ কোড দিতে হবে।

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

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

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

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

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

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

Swift

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
    };
};

Objective-C

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 প্রোডাক্টের জন্য সুইজলিং বন্ধ হয়ে যায়।

আপনি সুইজলিং বন্ধ করলে, আপনাকে অবশ্যই APNs ডিভাইস টোকেন, পুশ বিজ্ঞপ্তি এবং কাস্টম স্কিম রিডাইরেক্ট URL Firebase Authentication-এ পাস করতে হবে।

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

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

Swift

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
  // ...
}

Objective-C

- (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 যাচাইকরণ সম্পর্কিত বিজ্ঞপ্তি চেক করুন।

Swift

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.
}

Objective-C

- (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.
}

কাস্টম স্কিম রিডাইরেক্ট URL ম্যানেজ করতে, application(_:open:options:) পদ্ধতি প্রয়োগ করুন এবং সেগুলিতে Auth-এর canHandleURL(_:) পদ্ধতিতে URL পাস করুন।

Swift

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.
}

Objective-C

- (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:) পদ্ধতি প্রয়োগ করুন এবং সেগুলিতে, URL-কে Auth-এর canHandleURL(_:) পদ্ধতিতে পাস করুন।

Swift

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.
}

Objective-C

- (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.
  }
}

পরবর্তী ধাপ

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

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

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

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

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

Swift

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

Objective-C

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

এছাড়াও, আপনি হয়ত সম্পূর্ণ রেঞ্জের যাচাইকরণ সংক্রান্ত সমস্যার জন্য সমস্যা সমাধান করার কোড যোগ করতে চাইবেন। সমস্যার সমাধান করা দেখুন।