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

আপনি যদি আইডেন্টিটি প্ল্যাটফর্মের সাথে Firebase প্রমাণীকরণে আপগ্রেড করে থাকেন, তাহলে আপনি আপনার Flutter অ্যাপে SMS মাল্টি-ফ্যাক্টর প্রমাণীকরণ যোগ করতে পারেন।

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

তুমি শুরু করার আগে

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

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

  3. Android : আপনি যদি ইতিমধ্যেই Firebase কনসোলে আপনার অ্যাপের SHA-256 হ্যাশ সেট না করে থাকেন তাহলে তা করুন৷ আপনার অ্যাপের SHA-256 হ্যাশ খোঁজার বিষয়ে তথ্যের জন্য আপনার ক্লায়েন্ট প্রমাণীকরণ দেখুন।

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

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

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

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

  2. উন্নত বিভাগে, এসএমএস মাল্টি-ফ্যাক্টর প্রমাণীকরণ সক্ষম করুন।

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

  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/master/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: (_) {},
  );

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

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

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

  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/master/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) {
  ...
} 

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

এরপর কি