আপনার iOS অ্যাপে মাল্টি-ফ্যাক্টর প্রমাণীকরণ যোগ করুন

আপনি যদি Firebase Authentication with Identity Platform আপগ্রেড করে থাকেন, তাহলে আপনার iOS অ্যাপে এসএমএস মাল্টি-ফ্যাক্টর অথেনটিকেশন যোগ করতে পারবেন।

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

শুরু করার আগে

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

  2. আপনার অ্যাপ যেন ব্যবহারকারীর ইমেল যাচাই করে, তা নিশ্চিত করুন। মাল্টি-ফ্যাক্টর অথেনটিকেশন (MFA) এর জন্য ইমেল যাচাইকরণ প্রয়োজন। এটি ক্ষতিকারক ব্যক্তিদেরকে অন্যের ইমেল ব্যবহার করে কোনো পরিষেবাতে নিবন্ধন করা এবং তারপর দ্বিতীয় একটি ধাপ যোগ করে আসল মালিককে পরিষেবা থেকে বাদ দেওয়া থেকে বিরত রাখে।

মাল্টি-ফ্যাক্টর অথেন্টিকেশন সক্রিয় করা

  1. Firebase কনসোলের Authentication > Sign-in method পেজটি খুলুন।

  2. অ্যাডভান্সড সেকশনে, এসএমএস মাল্টি-ফ্যাক্টর অথেনটিকেশন চালু করুন।

    আপনার অ্যাপটি পরীক্ষা করার জন্য যে ফোন নম্বরগুলো ব্যবহার করবেন, সেগুলোও প্রবেশ করানো উচিত। যদিও এটি ঐচ্ছিক, তবে ডেভেলপমেন্টের সময় স্পিড কমে যাওয়া (থ্রটলিং) এড়ানোর জন্য টেস্ট ফোন নম্বর রেজিস্টার করার জন্য জোরালোভাবে সুপারিশ করা হয়।

  3. আপনি যদি ইতিমধ্যেই আপনার অ্যাপের ডোমেইনটিকে অনুমোদন না দিয়ে থাকেন, তাহলে Firebase কনসোলের Authentication > Settings পৃষ্ঠায় গিয়ে এটিকে অনুমতি তালিকায় যুক্ত করুন।

আপনার অ্যাপ যাচাই করা হচ্ছে

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

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

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

সাইলেন্ট নোটিফিকেশন ব্যবহার করা

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

  1. Xcode-এ আপনার প্রোজেক্টের জন্য পুশ নোটিফিকেশন চালু করুন

  2. Firebase কনসোল ব্যবহার করে আপনার APNs অথেন্টিকেশন কী আপলোড করুন (আপনার পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে Google Cloud Firebase এ স্থানান্তরিত হবে)। যদি আপনার কাছে আগে থেকে আপনার APNs অথেন্টিকেশন কী না থাকে, তবে এটি কীভাবে পাবেন তা জানতে "FCM-এর সাথে APNs কনফিগার করা" দেখুন।

    1. ফায়ারবেস কনসোল খুলুন।

    2. প্রজেক্ট সেটিংস- এ যান।

    3. ক্লাউড মেসেজিং ট্যাবটি নির্বাচন করুন।

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

    5. আপনার চাবিটি নির্বাচন করুন।

    6. কী-টির জন্য কী আইডি যোগ করুন। আপনি অ্যাপল ডেভেলপার মেম্বার সেন্টারের সার্টিফিকেট, আইডেন্টিফায়ার এবং প্রোফাইল বিভাগে কী আইডিটি খুঁজে পাবেন।

    7. আপলোড-এ ক্লিক করুন।

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

reCAPTCHA যাচাইকরণ ব্যবহার করে

ক্লায়েন্ট SDK-কে reCAPTCHA ব্যবহার করার জন্য সক্ষম করতে:

  1. Xcode-এ আপনার প্রোজেক্ট কনফিগারেশন খুলুন।

  2. বাম দিকের ট্রি ভিউতে প্রজেক্টের নামে ডাবল-ক্লিক করুন।

  3. টার্গেট সেকশন থেকে আপনার অ্যাপটি নির্বাচন করুন।

  4. তথ্য ট্যাবটি নির্বাচন করুন।

  5. URL Types সেকশনটি প্রসারিত করুন।

  6. + বোতামটিতে ক্লিক করুন।

  7. URL Schemes ফিল্ডে আপনার রিভার্সড ক্লায়েন্ট আইডি লিখুন। আপনি এই মানটি GoogleService-Info.plist কনফিগারেশন ফাইলে REVERSED_CLIENT_ID হিসাবে খুঁজে পাবেন।

সম্পূর্ণ হলে, আপনার কনফিগারেশনটি নিম্নলিখিতের মতো দেখতে হবে:

কাস্টম স্কিম

ঐচ্ছিকভাবে, reCAPTCHA দেখানোর সময় আপনার অ্যাপ যেভাবে SFSafariViewController বা UIWebView উপস্থাপন করে, তা আপনি কাস্টমাইজ করতে পারেন। এটি করার জন্য, FIRAuthUIDelegate প্রোটোকল মেনে চলে এমন একটি কাস্টম ক্লাস তৈরি করুন এবং এটিকে verifyPhoneNumber:UIDelegate:completion: পাস করুন।

তালিকাভুক্তির ধরণ নির্বাচন করা

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

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

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

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

  • যখন ব্যবহারকারী বর্ধিত নিরাপত্তা প্রয়োজন এমন ফিচারগুলো অ্যাক্সেস করতে চাইবেন, তখন পর্যায়ক্রমে দ্বিতীয় ফ্যাক্টর যুক্ত করার প্রয়োজন হবে।

দ্বিতীয় ফ্যাক্টর নথিভুক্ত করা

একজন ব্যবহারকারীর জন্য একটি নতুন সেকেন্ডারি ফ্যাক্টর নথিভুক্ত করতে:

  1. ব্যবহারকারীকে পুনরায় প্রমাণীকরণ করুন।

  2. ব্যবহারকারীকে তার ফোন নম্বর লিখতে বলুন।

  3. ব্যবহারকারীর জন্য একটি মাল্টি-ফ্যাক্টর সেশন নিন:

    সুইফট

    authResult.user.multiFactor.getSessionWithCompletion() { (session, error) in
      // ...
    }
    

    উদ্দেশ্য-সি

    [authResult.user.multiFactor
      getSessionWithCompletion:^(FIRMultiFactorSession * _Nullable session,
                                NSError * _Nullable error) {
        // ...
    }];
    
  4. ব্যবহারকারীর ফোনে একটি যাচাইকরণ বার্তা পাঠান। নিশ্চিত করুন যে ফোন নম্বরটি একটি + চিহ্ন দিয়ে শুরু হয় এবং এতে অন্য কোনো যতিচিহ্ন বা ফাঁকা স্থান (হোয়াইটস্পেস) না থাকে (উদাহরণস্বরূপ: +15105551234 )।

    সুইফট

    // Send SMS verification code.
    PhoneAuthProvider.provider().verifyPhoneNumber(
      phoneNumber,
      uiDelegate: nil,
      multiFactorSession: session) { (verificationId, error) in
        // verificationId will be needed for enrollment completion.
    }
    

    উদ্দেশ্য-সি

    // Send SMS verification code.
    [FIRPhoneAuthProvider.provider verifyPhoneNumber:phoneNumber
                                          UIDelegate:nil
                                  multiFactorSession:session
                                          completion:^(NSString * _Nullable verificationID,
                                                        NSError * _Nullable error) {
        // verificationId will be needed for enrollment completion.
    }];
    

    বাধ্যতামূলক না হলেও, ব্যবহারকারীদের আগে থেকেই জানিয়ে দেওয়া ভালো যে তাঁরা একটি এসএমএস বার্তা পাবেন এবং এক্ষেত্রে সাধারণ চার্জ প্রযোজ্য হবে।

    verifyPhoneNumber() মেথডটি সাইলেন্ট পুশ নোটিফিকেশন ব্যবহার করে ব্যাকগ্রাউন্ডে অ্যাপ ভেরিফিকেশন প্রক্রিয়া শুরু করে। যদি সাইলেন্ট পুশ নোটিফিকেশন উপলব্ধ না থাকে, তবে এর পরিবর্তে একটি reCAPTCHA চ্যালেঞ্জ দেওয়া হয়।

  5. এসএমএস কোডটি পাঠানো হয়ে গেলে, ব্যবহারকারীকে কোডটি যাচাই করতে বলুন। তারপর, তাদের প্রতিক্রিয়া ব্যবহার করে একটি PhoneAuthCredential তৈরি করুন।

    সুইফট

    // Ask user for the verification code. Then:
    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationId,
      verificationCode: verificationCode)
    

    উদ্দেশ্য-সি

    // Ask user for the SMS verification code. Then:
    FIRPhoneAuthCredential *credential = [FIRPhoneAuthProvider.provider
                                           credentialWithVerificationID:verificationID
                                           verificationCode:kPhoneSecondFactorVerificationCode];
    
  6. একটি অ্যাসারশন অবজেক্ট ইনিশিয়ালাইজ করুন:

    সুইফট

    let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
    

    উদ্দেশ্য-সি

    FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
    
  7. তালিকাভুক্তি সম্পূর্ণ করুন। ঐচ্ছিকভাবে, আপনি দ্বিতীয় ফ্যাক্টরের জন্য একটি ডিসপ্লে নাম নির্দিষ্ট করতে পারেন। একাধিক দ্বিতীয় ফ্যাক্টর থাকা ব্যবহারকারীদের জন্য এটি উপযোগী, কারণ প্রমাণীকরণ প্রক্রিয়ার সময় ফোন নম্বরটি গোপন রাখা হয় (উদাহরণস্বরূপ, +1******1234)।

    সুইফট

    // Complete enrollment. This will update the underlying tokens
    // and trigger ID token change listener.
    user.multiFactor.enroll(with: assertion, displayName: displayName) { (error) in
      // ...
    }
    

    উদ্দেশ্য-সি

    // Complete enrollment. This will update the underlying tokens
    // and trigger ID token change listener.
    [authResult.user.multiFactor enrollWithAssertion:assertion
                                         displayName:nil
                                          completion:^(NSError * _Nullable error) {
        // ...
    }];
    

নিচের কোডটিতে দ্বিতীয় ফ্যাক্টর নথিভুক্ত করার একটি সম্পূর্ণ উদাহরণ দেখানো হয়েছে:

সুইফট

let user = Auth.auth().currentUser
user?.multiFactor.getSessionWithCompletion({ (session, error) in
  // Send SMS verification code.
  PhoneAuthProvider.provider().verifyPhoneNumber(
    phoneNumber,
    uiDelegate: nil,
    multiFactorSession: session
  ) { (verificationId, error) in
    // verificationId will be needed for enrollment completion.
    // Ask user for the verification code.
    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationId!,
      verificationCode: phoneSecondFactorVerificationCode)
    let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
    // Complete enrollment. This will update the underlying tokens
    // and trigger ID token change listener.
    user?.multiFactor.enroll(with: assertion, displayName: displayName) { (error) in
      // ...
    }
  }
})

উদ্দেশ্য-সি

FIRUser *user = FIRAuth.auth.currentUser;
[user.multiFactor getSessionWithCompletion:^(FIRMultiFactorSession * _Nullable session,
                                              NSError * _Nullable error) {
    // Send SMS verification code.
    [FIRPhoneAuthProvider.provider
      verifyPhoneNumber:phoneNumber
      UIDelegate:nil
      multiFactorSession:session
      completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
        // verificationId will be needed for enrollment completion.

        // Ask user for the verification code.
        // ...

        // Then:
        FIRPhoneAuthCredential *credential =
            [FIRPhoneAuthProvider.provider credentialWithVerificationID:verificationID
                                                        verificationCode:kPhoneSecondFactorVerificationCode];
        FIRMultiFactorAssertion *assertion =
            [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];

        // Complete enrollment. This will update the underlying tokens
        // and trigger ID token change listener.
        [user.multiFactor enrollWithAssertion:assertion
                                  displayName:displayName
                                    completion:^(NSError * _Nullable error) {
            // ...
        }];
    }];
}];

অভিনন্দন! আপনি সফলভাবে একজন ব্যবহারকারীর জন্য দ্বিতীয় প্রমাণীকরণ ফ্যাক্টরটি নিবন্ধন করেছেন।

দ্বিতীয় ফ্যাক্টর ব্যবহার করে ব্যবহারকারীদের সাইন ইন করানো

দ্বি-স্তরীয় এসএমএস যাচাইকরণের মাধ্যমে একজন ব্যবহারকারীকে সাইন ইন করতে:

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

    উদাহরণস্বরূপ, যদি ব্যবহারকারীর প্রথম ধাপটি একটি ইমেল এবং পাসওয়ার্ড হয়:

    সুইফট

    Auth.auth().signIn(
      withEmail: email,
      password: password
    ) { (result, error) in
      let authError = error as NSError
      if authError?.code == AuthErrorCode.secondFactorRequired.rawValue {
        // The user is a multi-factor user. Second factor challenge is required.
        let resolver =
          authError!.userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
        // ...
      } else {
        // Handle other errors such as wrong password.
      }
    }
    

    উদ্দেশ্য-সি

    [FIRAuth.auth signInWithEmail:email
                         password:password
                       completion:^(FIRAuthDataResult * _Nullable authResult,
                                    NSError * _Nullable error) {
        if (error == nil || error.code != FIRAuthErrorCodeSecondFactorRequired) {
            // User is not enrolled with a second factor and is successfully signed in.
            // ...
        } else {
            // The user is a multi-factor user. Second factor challenge is required.
        }
    }];
    

    যদি ব্যবহারকারীর প্রথম ক্রেডেনশিয়ালটি OAuth-এর মতো কোনো ফেডারেটেড প্রোভাইডার হয়, তাহলে getCredentialWith() কল করার পর ত্রুটিটি ধরুন।

  2. যদি ব্যবহারকারীর একাধিক সেকেন্ডারি ফ্যাক্টর নথিভুক্ত করা থাকে, তাহলে তাকে জিজ্ঞাসা করুন কোনটি ব্যবহার করতে হবে। আপনি resolver.hints[selectedIndex].phoneNumber ব্যবহার করে মাস্ক করা ফোন নম্বর এবং resolver.hints[selectedIndex].displayName ব্যবহার করে ডিসপ্লে নেম পেতে পারেন।

    সুইফট

    // Ask user which second factor to use. Then:
    if resolver.hints[selectedIndex].factorID == PhoneMultiFactorID {
      // User selected a phone second factor.
      // ...
    } else if resolver.hints[selectedIndex].factorID == TotpMultiFactorID {
      // User selected a TOTP second factor.
      // ...
    } else {
      // Unsupported second factor.
    }
    

    উদ্দেশ্য-সি

    FIRMultiFactorResolver *resolver =
        (FIRMultiFactorResolver *) error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
    
    // Ask user which second factor to use. Then:
    FIRPhoneMultiFactorInfo *hint = (FIRPhoneMultiFactorInfo *) resolver.hints[selectedIndex];
    if (hint.factorID == FIRPhoneMultiFactorID) {
      // User selected a phone second factor.
      // ...
    } else if (hint.factorID == FIRTOTPMultiFactorID) {
      // User selected a TOTP second factor.
      // ...
    } else {
      // Unsupported second factor.
    }
    
  3. ব্যবহারকারীর ফোনে একটি যাচাইকরণ বার্তা পাঠান:

    সুইফট

    // Send SMS verification code.
    let hint = resolver.hints[selectedIndex] as! PhoneMultiFactorInfo
    PhoneAuthProvider.provider().verifyPhoneNumber(
      with: hint,
      uiDelegate: nil,
      multiFactorSession: resolver.session
    ) { (verificationId, error) in
      // verificationId will be needed for sign-in completion.
    }
    

    উদ্দেশ্য-সি

    // Send SMS verification code
    [FIRPhoneAuthProvider.provider
      verifyPhoneNumberWithMultiFactorInfo:hint
      UIDelegate:nil
      multiFactorSession:resolver.session
      completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
        if (error != nil) {
            // Failed to verify phone number.
        }
    }];
    
  4. এসএমএস কোডটি পাঠানো হয়ে গেলে, ব্যবহারকারীকে কোডটি যাচাই করতে বলুন এবং এটি ব্যবহার করে একটি PhoneAuthCredential তৈরি করুন।

    সুইফট

    // Ask user for the verification code. Then:
    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationId!,
      verificationCode: verificationCodeFromUser)
    

    উদ্দেশ্য-সি

    // Ask user for the SMS verification code. Then:
    FIRPhoneAuthCredential *credential =
        [FIRPhoneAuthProvider.provider
          credentialWithVerificationID:verificationID
                      verificationCode:verificationCodeFromUser];
    
  5. ক্রেডেনশিয়াল দিয়ে একটি অ্যাসারশন অবজেক্ট ইনিশিয়ালাইজ করুন:

    সুইফট

    let assertion = PhoneMultiFactorGenerator.assertion(with: credential)
    

    উদ্দেশ্য-সি

    FIRMultiFactorAssertion *assertion =
        [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
    
  6. সাইন-ইনটি সমাধান করুন। এরপর আপনি মূল সাইন-ইন ফলাফলটি অ্যাক্সেস করতে পারবেন, যেখানে স্ট্যান্ডার্ড প্রোভাইডার-নির্দিষ্ট ডেটা এবং প্রমাণীকরণ ক্রেডেনশিয়াল অন্তর্ভুক্ত রয়েছে:

    সুইফট

    // Complete sign-in. This will also trigger the Auth state listeners.
    resolver.resolveSignIn(with: assertion) { (authResult, error) in
      // authResult will also contain the user, additionalUserInfo, optional
      // credential (null for email/password) associated with the first factor sign-in.
    
      // For example, if the user signed in with Google as a first factor,
      // authResult.additionalUserInfo will contain data related to Google provider that
      // the user signed in with.
    
      // user.credential contains the Google OAuth credential.
      // user.credential.accessToken contains the Google OAuth access token.
      // user.credential.idToken contains the Google OAuth ID token.
    }
    

    উদ্দেশ্য-সি

    // Complete sign-in.
    [resolver resolveSignInWithAssertion:assertion
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                            NSError * _Nullable error) {
        if (error != nil) {
            // User successfully signed in with the second factor phone number.
        }
    }];
    

নিচের কোডটিতে একজন মাল্টি-ফ্যাক্টর ব্যবহারকারীকে সাইন ইন করার একটি সম্পূর্ণ উদাহরণ দেখানো হয়েছে:

সুইফট

Auth.auth().signIn(
  withEmail: email,
  password: password
) { (result, error) in
  let authError = error as NSError?
  if authError?.code == AuthErrorCode.secondFactorRequired.rawValue {
    let resolver =
      authError!.userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver

    // Ask user which second factor to use.
    // ...

    // Then:
    let hint = resolver.hints[selectedIndex] as! PhoneMultiFactorInfo

    // Send SMS verification code
    PhoneAuthProvider.provider().verifyPhoneNumber(
      with: hint,
      uiDelegate: nil,
      multiFactorSession: resolver.session
    ) { (verificationId, error) in
      if error != nil {
        // Failed to verify phone number.
      }
      // Ask user for the SMS verification code.
      // ...

      // Then:
      let credential = PhoneAuthProvider.provider().credential(
        withVerificationID: verificationId!,
        verificationCode: verificationCodeFromUser)
      let assertion = PhoneMultiFactorGenerator.assertion(with: credential)

      // Complete sign-in.
      resolver.resolveSignIn(with: assertion) { (authResult, error) in
        if error != nil {
          // User successfully signed in with the second factor phone number.
        }
      }
    }
  }
}

উদ্দেশ্য-সি

[FIRAuth.auth signInWithEmail:email
                     password:password
                   completion:^(FIRAuthDataResult * _Nullable authResult,
                               NSError * _Nullable error) {
    if (error == nil || error.code != FIRAuthErrorCodeSecondFactorRequired) {
        // User is not enrolled with a second factor and is successfully signed in.
        // ...
    } else {
        FIRMultiFactorResolver *resolver =
            (FIRMultiFactorResolver *) error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];

        // Ask user which second factor to use.
        // ...

        // Then:
        FIRPhoneMultiFactorInfo *hint = (FIRPhoneMultiFactorInfo *) resolver.hints[selectedIndex];

        // Send SMS verification code
        [FIRPhoneAuthProvider.provider
          verifyPhoneNumberWithMultiFactorInfo:hint
                                    UIDelegate:nil
                            multiFactorSession:resolver.session
                                    completion:^(NSString * _Nullable verificationID,
                                                NSError * _Nullable error) {
            if (error != nil) {
                // Failed to verify phone number.
            }

            // Ask user for the SMS verification code.
            // ...

            // Then:
            FIRPhoneAuthCredential *credential =
                [FIRPhoneAuthProvider.provider
                  credentialWithVerificationID:verificationID
                              verificationCode:kPhoneSecondFactorVerificationCode];
            FIRMultiFactorAssertion *assertion =
                [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];

            // Complete sign-in.
            [resolver resolveSignInWithAssertion:assertion
                                      completion:^(FIRAuthDataResult * _Nullable authResult,
                                                    NSError * _Nullable error) {
                if (error != nil) {
                    // User successfully signed in with the second factor phone number.
                }
            }];
        }];
    }
}];

অভিনন্দন! আপনি মাল্টি-ফ্যাক্টর অথেনটিকেশন ব্যবহার করে সফলভাবে একজন ব্যবহারকারীকে সাইন ইন করিয়েছেন।

এরপর কী?