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

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

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

শুরু করার আগে

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

    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 মেম্বার সেন্টারে একটি তৈরি করেছেন।

    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:)-এ পাস করুন।

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

ফোন নম্বর দিয়ে সাইন-ইন শুরু করতে, ব্যবহারকারীকে এমন একটি ইন্টারফেস দিন যা তাদের ফোন নম্বর দিতে প্রম্পট করে এবং তারপরে Firebase-কে অনুরোধ করতে 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 প্রপার্টির মাধ্যমে অনুমোদন ভাষা নির্দিষ্ট করে লোকালও করা যেতে পারে।

    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:) কলটি সফল হলে, ব্যবহারকারীকে এসএমএস মেসেজে যাচাইকরণ কোডটি পেলে সেটি টাইপ করতে বলতে পারেন।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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:): পদ্ধতিতে, Firebase যাচাইকরণ সম্পর্কিত বিজ্ঞপ্তি চেক করতে Auth-এর canHandleNotification(_:) পদ্ধতি কল করুন।

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

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

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