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

আপনি ফায়ারবেস অথেনটিকেশন ব্যবহার করে কোনো ব্যবহারকারীকে একটি লিঙ্কসহ ইমেল পাঠিয়ে সাইন ইন করাতে পারেন, যেখানে ক্লিক করে তিনি সাইন ইন করতে পারবেন। এই প্রক্রিয়ায় ব্যবহারকারীর ইমেল অ্যাড্রেসটিও যাচাই করা হয়।

ইমেইলের মাধ্যমে সাইন ইন করার অনেক সুবিধা রয়েছে:

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

শুরু করার আগে

ফায়ারবেস ডিপেন্ডেন্সিগুলো ইনস্টল ও পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

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

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

  1. Firebase কনসোলে , Auth সেকশনটি খুলুন।
  2. সাইন ইন পদ্ধতি ট্যাবে, ইমেল/পাসওয়ার্ড প্রদানকারীকে সক্রিয় করুন। মনে রাখবেন যে, ইমেল লিঙ্ক সাইন-ইন ব্যবহার করার জন্য ইমেল/পাসওয়ার্ড সাইন-ইন অবশ্যই সক্রিয় থাকতে হবে।
  3. একই বিভাগে, ইমেল লিঙ্ক (পাসওয়ার্ডবিহীন সাইন-ইন) পদ্ধতিটি সক্রিয় করুন।
  4. সংরক্ষণ করুন- এ ক্লিক করুন।

প্রমাণীকরণ প্রক্রিয়া শুরু করতে, ব্যবহারকারীকে এমন একটি ইন্টারফেস দেখান যেখানে তার ইমেল ঠিকানা দিতে বলা হবে এবং তারপর Firebase-কে ব্যবহারকারীর ইমেলে প্রমাণীকরণ লিঙ্কটি পাঠানোর অনুরোধ জানাতে sendSignInLink কল করুন।

  1. ActionCodeSettings অবজেক্টটি তৈরি করুন, যা ফায়ারবেসকে ইমেল লিঙ্কটি কীভাবে তৈরি করতে হবে সে সম্পর্কে নির্দেশনা প্রদান করে। নিম্নলিখিত ফিল্ডগুলি সেট করুন:

    • url : এমবেড করার জন্য ডিপ লিঙ্ক এবং সাথে পাঠানোর জন্য যেকোনো অতিরিক্ত স্টেট। লিঙ্কটির ডোমেইনকে অবশ্যই ফায়ারবেস কনসোলের অনুমোদিত ডোমেইনের তালিকায় হোয়াইটলিস্টেড থাকতে হবে, যা সাইন-ইন মেথড ট্যাবে (অথেন্টিকেশন -> সাইন-ইন মেথড) গিয়ে খুঁজে পাওয়া যাবে।
    • iOSBundleID এবং androidPackageName : এটি Firebase Authentication নির্ধারণ করতে সাহায্য করে যে, এটি অ্যান্ড্রয়েড বা অ্যাপল ডিভাইসে খোলার জন্য শুধুমাত্র ওয়েব-ভিত্তিক নাকি মোবাইল লিঙ্ক তৈরি করবে।
    • handleCodeInApp : এটিকে true-তে সেট করুন। অন্যান্য আউট-অফ-ব্যান্ড ইমেল অ্যাকশনের (যেমন পাসওয়ার্ড রিসেট এবং ইমেল ভেরিফিকেশন) মতো নয়, সাইন-ইন অপারেশনটি সবসময় অ্যাপের মধ্যেই সম্পন্ন করতে হবে। এর কারণ হলো, ফ্লো-এর শেষে ব্যবহারকারীকে সাইন-ইন করা অবস্থায় এবং তার অথেন্টিকেশন স্টেট অ্যাপের মধ্যেই সংরক্ষিত থাকার কথা।
    • linkDomain : যখন কোনো প্রোজেক্টের জন্য কাস্টম Hosting লিঙ্ক ডোমেইন নির্ধারণ করা হয়, তখন নির্দিষ্ট মোবাইল অ্যাপ দ্বারা লিঙ্কটি খোলার জন্য কোনটি ব্যবহার করা হবে তা নির্দিষ্ট করুন। অন্যথায় ডিফল্ট ডোমেইন স্বয়ংক্রিয়ভাবে নির্বাচিত হয় (উদাহরণস্বরূপ, PROJECT_ID .firebaseapp.com )
    • dynamicLinkDomain : অপ্রচলিত। এই প্যারামিটারটি উল্লেখ করবেন না।

    সুইফট

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    উদ্দেশ্য-সি

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    ActionCodeSettings সম্পর্কে আরও জানতে, "ইমেল অ্যাকশনে স্টেট পাস করা" বিভাগটি দেখুন।

  2. ব্যবহারকারীর ইমেইল ঠিকানা জিজ্ঞাসা করুন।

  3. ব্যবহারকারীর ইমেইলে প্রমাণীকরণ লিঙ্কটি পাঠান এবং তার ইমেইলটি সংরক্ষণ করুন, যাতে ব্যবহারকারী একই ডিভাইসে ইমেইল সাইন-ইন সম্পন্ন করলে তা কাজে লাগে।

    সুইফট

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    উদ্দেশ্য-সি

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

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

অনাকাঙ্ক্ষিত ব্যবহারকারী বা অনাকাঙ্ক্ষিত ডিভাইসে সাইন-ইন করার জন্য সাইন-ইন লিঙ্কটি যাতে ব্যবহার করা না যায়, সেজন্য সাইন-ইন প্রক্রিয়া সম্পন্ন করার সময় Firebase Auth-এর জন্য ব্যবহারকারীর ইমেল ঠিকানা প্রদান করা আবশ্যক। সাইন-ইন সফল হওয়ার জন্য, এই ইমেল ঠিকানাটি অবশ্যই সেই ঠিকানার সাথে মিলতে হবে যেখানে সাইন-ইন লিঙ্কটি মূলত পাঠানো হয়েছিল।

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

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

অ্যাপল মোবাইল অ্যাপে সাইন-ইন সম্পন্ন করা

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

Firebase Hosting কনফিগার করুন

মোবাইল অ্যাপ্লিকেশনে খোলার জন্য কোনো লিঙ্ক তৈরি ও পাঠানোর সময় Firebase Authentication Firebase Hosting ডোমেইন ব্যবহার করে। আপনার জন্য একটি ডিফল্ট Firebase Hosting ডোমেইন আগে থেকেই কনফিগার করা আছে।

  1. Firebase Hosting ডোমেইনগুলো কনফিগার করুন:

    Firebase কনসোলে, হোস্টিং সেকশনটি খুলুন।

    • মোবাইল অ্যাপ্লিকেশনে খোলা ইমেল লিঙ্কের জন্য যদি আপনি ডিফল্ট ডোমেইন ব্যবহার করতে চান, তাহলে আপনার ডিফল্ট সাইটে যান এবং আপনার ডিফল্ট Hosting ডোমেইনটি নোট করে নিন। একটি ডিফল্ট Hosting ডোমেইন সাধারণত দেখতে এইরকম হয়: PROJECT_ID .firebaseapp.com .

      ইনকামিং লিঙ্কটি গ্রহণ করার জন্য আপনার অ্যাপ কনফিগার করার সময় এই মানটির প্রয়োজন হবে।

    • আপনি যদি ইমেল লিঙ্কের জন্য একটি কাস্টম ডোমেইন ব্যবহার করতে চান, তাহলে আপনি Firebase Hosting এ একটি রেজিস্টার করে লিঙ্কের ডোমেইন হিসেবে সেটি ব্যবহার করতে পারেন।

  2. অ্যাপল অ্যাপ্লিকেশন কনফিগার করা:

    অ্যাপ লিঙ্কের জন্য আপনাকে নির্বাচিত ডোমেইনটিকে একটি অ্যাসোসিয়েটেড ডোমেইন হিসেবে কনফিগার করতে হবে। আপনার অ্যাপে এনটাইটেলমেন্ট সেট আপ করার জন্য, Xcode-এ টার্গেটের ' Signing & Capabilities' ট্যাবটি খুলুন এবং পূর্ববর্তী ধাপ থেকে পাওয়া Firebase Hosting ডোমেইনগুলোকে 'Associated Domains' ক্যাপাবিলিটিতে যোগ করুন। যদি ডিফল্ট Firebase Hosting ডোমেইন ব্যবহার করা হয়, তবে এটি হবে applinks: PROJECT_ID .firebaseapp.com .

    আরও তথ্যের জন্য অ্যাপলের ডকুমেন্টেশন সাইটে ‘Supporting associated domains’ দেখুন।

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

সুইফট

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

উদ্দেশ্য-সি

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনে ইমেল লিঙ্কের মাধ্যমে সাইন-ইন কীভাবে পরিচালনা করতে হয়, তা জানতে অ্যান্ড্রয়েড গাইডটি দেখুন।

একটি ওয়েব অ্যাপ্লিকেশনে ইমেল লিঙ্কের মাধ্যমে সাইন-ইন কীভাবে পরিচালনা করতে হয়, তা জানতে ওয়েব গাইডটি দেখুন।

আপনি এই প্রমাণীকরণ পদ্ধতিটি কোনো বিদ্যমান ব্যবহারকারীর সাথেও লিঙ্ক করতে পারেন। উদাহরণস্বরূপ, যে ব্যবহারকারী পূর্বে অন্য কোনো প্রদানকারী, যেমন একটি ফোন নম্বর, ব্যবহার করে প্রমাণীকৃত হয়েছেন, তিনি তার বিদ্যমান অ্যাকাউন্টে এই সাইন-ইন পদ্ধতিটি যোগ করতে পারেন।

পার্থক্যটা হবে অপারেশনটির দ্বিতীয়ার্ধে:

সুইফট

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

উদ্দেশ্য-সি

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

কোনো সংবেদনশীল কার্যক্রম চালানোর আগে ইমেল লিঙ্কের ব্যবহারকারীকে পুনরায় প্রমাণীকরণের জন্যও এটি ব্যবহার করা যেতে পারে।

সুইফট

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

উদ্দেশ্য-সি

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

তবে, যেহেতু প্রক্রিয়াটি এমন কোনো ভিন্ন ডিভাইসে শেষ হতে পারে যেখানে মূল ব্যবহারকারী লগ ইন করা ছিলেন না, তাই এই প্রক্রিয়াটি সম্পূর্ণ নাও হতে পারে। সেক্ষেত্রে, ব্যবহারকারীকে একই ডিভাইসে লিঙ্কটি খুলতে বাধ্য করার জন্য একটি ত্রুটি দেখানো যেতে পারে। অপারেশনের ধরন এবং ব্যবহারকারীর ইউআইডি (uid) সম্পর্কে তথ্য প্রদানের জন্য লিঙ্কে কিছু স্টেট (state) পাঠানো যেতে পারে।

Firebase Authentication iOS SDK v11.8.0-এর আগে, ইমেল লিঙ্কের মাধ্যমে সাইন ইন করার ফিচারটি সঠিক অ্যাপে লিঙ্কগুলো খোলার জন্য Firebase Dynamic Links এর উপর নির্ভর করত। এই ভেরিফিকেশন লিঙ্কগুলো এখন অপ্রচলিত, কারণ Firebase Dynamic Links ২৫শে আগস্ট, ২০২৫-এ বন্ধ হয়ে যাবে।

আপনার অ্যাপ যদি পুরোনো ধরনের লিঙ্ক ব্যবহার করে থাকে, তবে আপনার অ্যাপটিকে নতুন Firebase Hosting ভিত্তিক সিস্টেমে স্থানান্তর করা উচিত।

যদি আপনি আপনার প্রজেক্টটি ১৫ই সেপ্টেম্বর, ২০২৩ বা তার পরে তৈরি করে থাকেন, তাহলে ইমেইল এনুমারেশন প্রোটেকশন ডিফল্টরূপে সক্রিয় থাকে। এই ফিচারটি আপনার প্রজেক্টের ইউজার অ্যাকাউন্টগুলোর নিরাপত্তা উন্নত করে, কিন্তু এটি fetchSignInMethodsForEmail() মেথডটিকে নিষ্ক্রিয় করে দেয়, যা আমরা পূর্বে আইডেন্টিফায়ার-ফার্স্ট ফ্লো বাস্তবায়নের জন্য সুপারিশ করেছিলাম।

যদিও আপনি আপনার প্রোজেক্টের জন্য ইমেল গণনা সুরক্ষা নিষ্ক্রিয় করতে পারেন, আমরা তা না করার পরামর্শ দিই।

আরও জানতে, ইমেল গণনা সুরক্ষা সক্ষম বা নিষ্ক্রিয় করুন দেখুন।

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

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

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

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

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

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

সুইফট

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

উদ্দেশ্য-সি

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

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