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

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

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

শুরু করার আগে

  1. মাল্টি-ফ্যাক্টর প্রমাণীকরণ সমর্থন করে এমন কমপক্ষে একটি প্রদানকারী সক্ষম করুন। ফোন প্রমাণীকরণ, বেনামী প্রমাণীকরণ এবং অ্যাপল গেম সেন্টার ছাড়া প্রতিটি প্রদানকারী MFA সমর্থন করে।

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

  3. অ্যান্ড্রয়েড : যদি আপনি ইতিমধ্যেই আপনার অ্যাপের SHA-256 হ্যাশ Firebase কনসোলে সেট না করে থাকেন, তাহলে তা করুন। আপনার অ্যাপের SHA-256 হ্যাশ খুঁজে পাওয়ার বিষয়ে তথ্যের জন্য Authenticating Your Client দেখুন।

  4. iOS : Xcode-এ, আপনার প্রোজেক্টের জন্য পুশ নোটিফিকেশন সক্ষম করুন এবং নিশ্চিত করুন যে আপনার APN প্রমাণীকরণ কীটি Firebase Cloud Messaging (FCM) দিয়ে কনফিগার করা আছে। অতিরিক্তভাবে, আপনাকে দূরবর্তী বিজ্ঞপ্তিগুলির জন্য ব্যাকগ্রাউন্ড মোড সক্ষম করতে হবে। এই ধাপের বিস্তারিত ব্যাখ্যা দেখতে, Firebase iOS Phone Auth ডকুমেন্টেশনটি দেখুন।

  5. ওয়েব : নিশ্চিত করুন যে আপনি OAuth রিডাইরেক্ট ডোমেনের অধীনে Firebase কনসোলে আপনার অ্যাপ্লিকেশন ডোমেন যোগ করেছেন।

মাল্টি-ফ্যাক্টর প্রমাণীকরণ সক্ষম করা

  1. Firebase কনসোলের প্রমাণীকরণ > সাইন-ইন পদ্ধতি পৃষ্ঠাটি খুলুন।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    final multiFactorSession = await user.multiFactor.getSession();
    
  4. মাল্টি ফ্যাক্টর সেশন এবং আপনার কলব্যাকের মাধ্যমে ফোন নম্বরটি যাচাই করুন:

    await FirebaseAuth.instance.verifyPhoneNumber(
      multiFactorSession: multiFactorSession,
      phoneNumber: phoneNumber,
      verificationCompleted: (_) {},
      verificationFailed: (_) {},
      codeSent: (String verificationId, int? resendToken) async {
        // The SMS verification code has been sent to the provided phone number.
        // ...
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    
  5. এসএমএস কোডটি পাঠানো হয়ে গেলে, ব্যবহারকারীকে কোডটি যাচাই করতে বলুন:

    final credential = PhoneAuthProvider.credential(
      verificationId: verificationId,
      smsCode: smsCode,
    );
    
  6. ভর্তি সম্পূর্ণ করুন:

    await user.multiFactor.enroll(
      PhoneMultiFactorGenerator.getAssertion(
        credential,
      ),
    );
    

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

  final session = await user.multiFactor.getSession();
  final auth = FirebaseAuth.instance;
  await auth.verifyPhoneNumber(
    multiFactorSession: session,
    phoneNumber: phoneController.text,
    verificationCompleted: (_) {},
    verificationFailed: (_) {},
    codeSent: (String verificationId, int? resendToken) async {
      // See `firebase_auth` example app for a method of retrieving user's sms code:
      // https://github.com/firebase/flutterfire/blob/main/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
      final smsCode = await getSmsCodeFromUser(context);

      if (smsCode != null) {
        // Create a PhoneAuthCredential with the code
        final credential = PhoneAuthProvider.credential(
          verificationId: verificationId,
          smsCode: smsCode,
        );

        try {
          await user.multiFactor.enroll(
            PhoneMultiFactorGenerator.getAssertion(
              credential,
            ),
          );
        } on FirebaseAuthException catch (e) {
          print(e.message);
        }
      }
    },
    codeAutoRetrievalTimeout: (_) {},
  );

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

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

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

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

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

    try {
      await _auth.signInWithEmailAndPassword(
          email: emailController.text,
          password: passwordController.text,
      );
      // User is not enrolled with a second factor and is successfully
      // signed in.
      // ...
    } on FirebaseAuthMultiFactorException catch (e) {
      // The user is a multi-factor user. Second factor challenge is required
      final resolver = e.resolver
      // ...
    }
    
  2. যদি ব্যবহারকারীর একাধিক গৌণ উপাদান নথিভুক্ত থাকে, তাহলে তাদের জিজ্ঞাসা করুন কোনটি ব্যবহার করবেন:

    final session = e.resolver.session;
    
    final hint = e.resolver.hints[selectedHint];
    
  3. ব্যবহারকারীর ফোনে ইঙ্গিত এবং মাল্টি-ফ্যাক্টর সেশন সহ একটি যাচাইকরণ বার্তা পাঠান:

    await FirebaseAuth.instance.verifyPhoneNumber(
      multiFactorSession: session,
      multiFactorInfo: hint,
      verificationCompleted: (_) {},
      verificationFailed: (_) {},
      codeSent: (String verificationId, int? resendToken) async {
        // ...
      },
      codeAutoRetrievalTimeout: (_) {},
    );
    
  4. সেকেন্ডারি প্রমাণীকরণ সম্পন্ন করতে resolver.resolveSignIn() কল করুন:

    final smsCode = await getSmsCodeFromUser(context);
    if (smsCode != null) {
      // Create a PhoneAuthCredential with the code
      final credential = PhoneAuthProvider.credential(
        verificationId: verificationId,
        smsCode: smsCode,
      );
    
      try {
        await e.resolver.resolveSignIn(
          PhoneMultiFactorGenerator.getAssertion(credential)
        );
      } on FirebaseAuthException catch (e) {
        print(e.message);
      }
    }
    

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

try {
  await _auth.signInWithEmailAndPassword(
    email: emailController.text,
    password: passwordController.text,
  );
} on FirebaseAuthMultiFactorException catch (e) {
  setState(() {
    error = '${e.message}';
  });
  final firstHint = e.resolver.hints.first;
  if (firstHint is! PhoneMultiFactorInfo) {
    return;
  }
  await FirebaseAuth.instance.verifyPhoneNumber(
    multiFactorSession: e.resolver.session,
    multiFactorInfo: firstHint,
    verificationCompleted: (_) {},
    verificationFailed: (_) {},
    codeSent: (String verificationId, int? resendToken) async {
      // See `firebase_auth` example app for a method of retrieving user's sms code:
      // https://github.com/firebase/flutterfire/blob/main/packages/firebase_auth/firebase_auth/example/lib/auth.dart#L591
      final smsCode = await getSmsCodeFromUser(context);

      if (smsCode != null) {
        // Create a PhoneAuthCredential with the code
        final credential = PhoneAuthProvider.credential(
          verificationId: verificationId,
          smsCode: smsCode,
        );

        try {
          await e.resolver.resolveSignIn(
            PhoneMultiFactorGenerator.getAssertion(
              credential,
            ),
          );
        } on FirebaseAuthException catch (e) {
          print(e.message);
        }
      }
    },
    codeAutoRetrievalTimeout: (_) {},
  );
} catch (e) {
  ...
}

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

এরপর কি?