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

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

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

শুরু করার আগে

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

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

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

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

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

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

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

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

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

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

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

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

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

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

নীরব বিজ্ঞপ্তি পেতে শুরু করুন

Firebase Authentication সাথে ব্যবহারের জন্য APN বিজ্ঞপ্তিগুলি সক্ষম করতে:

  1. এক্সকোডে, আপনার প্রকল্পের জন্য পুশ বিজ্ঞপ্তি সক্ষম করুন
  2. আপনার APN প্রমাণীকরণ কী Firebase-এ আপলোড করুন। যদি আপনার কাছে ইতিমধ্যেই একটি APN প্রমাণীকরণ কী না থাকে, তাহলে Apple Developer Member Center- এ একটি তৈরি করতে ভুলবেন না।

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

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

    3. আপনার কী যেখানে সংরক্ষণ করেছেন সেই স্থানে ব্রাউজ করুন, এটি নির্বাচন করুন এবং খুলুন ক্লিক করুন। কীটির জন্য কী আইডি যোগ করুন ( অ্যাপল ডেভেলপার সদস্য কেন্দ্রে উপলব্ধ) এবং আপলোড ক্লিক করুন।

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

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

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

Firebase SDK-কে reCAPTCHA যাচাইকরণ ব্যবহার করতে সক্ষম করতে:

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

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

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

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

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

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

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

  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 পদ্ধতিটি reentrant: যদি আপনি এটিকে একাধিকবার কল করেন, যেমন একটি ভিউয়ের onAppear পদ্ধতিতে, তাহলে verifyPhoneNumber পদ্ধতিটি দ্বিতীয় SMS পাঠাবে না যদি না মূল অনুরোধের সময়সীমা শেষ হয়ে যায়।

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

    Firebase দ্বারা প্রেরিত SMS বার্তাটি আপনার Auth ইনস্ট্যান্সে languageCode সম্পত্তির মাধ্যমে auth ভাষা নির্দিষ্ট করে স্থানীয়করণ করা যেতে পারে।

    সুইফট

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

    অবজেক্টিভ-সি

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

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

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

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

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

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

  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 সিমুলেটর বা অ্যান্ড্রয়েড এমুলেটর থেকে সরাসরি পরীক্ষা করতে পারেন।

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

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

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

ইন্টিগ্রেশন পরীক্ষা

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

iOS-এ, verifyPhoneNumber কল করার আগে appVerificationDisabledForTesting সেটিংটি TRUE তে সেট করতে হবে। এটি কোনও APN টোকেন ছাড়াই বা ব্যাকগ্রাউন্ডে নীরব পুশ বিজ্ঞপ্তি পাঠানো ছাড়াই প্রক্রিয়া করা হয়, যার ফলে সিমুলেটরে পরীক্ষা করা সহজ হয়। এটি 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 আপনার অ্যাপের APN টোকেন স্বয়ংক্রিয়ভাবে পেতে, Firebase আপনার অ্যাপে যে নীরব পুশ বিজ্ঞপ্তিগুলি পাঠায় তা পরিচালনা করতে এবং যাচাইকরণের সময় reCAPTCHA যাচাইকরণ পৃষ্ঠা থেকে কাস্টম স্কিম পুনঃনির্দেশ স্বয়ংক্রিয়ভাবে আটকাতে সুইজলিং পদ্ধতি ব্যবহার করে।

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

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

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

APN ডিভাইস টোকেন পেতে, 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.
}

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

সুইফট

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

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

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

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

  • আপনার Firebase Realtime Database এবং Cloud Storage সিকিউরিটি রুলস -এ, আপনি 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;
}

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