আপনার Android অ্যাপে TOTP বহু-স্তরীয় যাচাইকরণ যোগ করা

আপনি Firebase Authentication with Identity Platform-এ আপগ্রেড করে থাকলে, আপনার অ্যাপে টাইম-বেসড ওয়ান-টাইম পাসওয়ার্ড (TOTP) মাল্টি-ফ্যাক্টর অথেন্টিকেশন (MFA) যোগ করতে পারবেন।

Firebase Authentication with Identity Platform আপনাকে MFA-এর জন্য অতিরিক্ত ফ্যাক্টর হিসেবে TOTP ব্যবহার করতে দেয়। আপনি এই ফিচার চালু করলে, আপনার অ্যাপে সাইন-ইন করার চেষ্টা করা ব্যবহারকারীরা TOTP-এর জন্য একটি অনুরোধ দেখতে পাবেন। এটি তৈরি করতে, তাকে অবশ্যই এমন একটি যাচাইকারী অ্যাপ ব্যবহার করতে হবে যা সঠিক TOTP কোড তৈরি করতে পারে, যেমন Google Authenticator।

শুরু করার আগে

  1. MFA কাজ করে এমন অন্তত একটি পরিষেবা প্রদানকারী চালু করুন। মনে রাখবেন, নিম্নলিখিতগুলি ব্যতীত সব পরিষেবা প্রদানকারী MFA-তে কাজ করে:

    • ফোন অথেন্টিকেশন
    • পরিচয় গোপন করা অথেন্টিকেশন
    • কাস্টম অথেন্টিকেশন টোকেন
    • Apple Game Center
  2. আপনার অ্যাপ যাতে ব্যবহারকারীর ইমেল আইডি যাচাই করে তা নিশ্চিত করুন। MFA-এর জন্য ইমেল যাচাইকরণ প্রয়োজন। এর ফলে ক্ষতিকর ব্যক্তিরা এমন ইমেল আইডি দিয়ে কোনও পরিষেবায় রেজিস্টার করতে পারে না যেটির মালিক তারা নয় এবং তারপর দ্বিতীয় ফ্যাক্টর যোগ করে ইমেল আইডির আসল মালিককে লক আউট করে দেয়।

  3. আপনি আগে থেকে এটি না করে থাকলে, Firebase Android SDK ইনস্টল করুন।

    TOTP MFA শুধুমাত্র Android SDK ভার্সন v22.1.0 এবং তার পরবর্তী ভার্সনে কাজ করে।

TOTP MFA চালু করুন

দ্বিতীয় ফ্যাক্টর হিসেবে TOTP চালু করতে, Admin SDK ব্যবহার করুন অথবা প্রোজেক্ট কনফিগারেশন REST এন্ডপয়েন্টে কল করুন।

Admin SDK ব্যবহার করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. আপনি আগে থেকে এটি না করে থাকলে, Firebase Admin Node.js SDK ইনস্টল করুন।

    TOTP MFA শুধুমাত্র Firebase Admin Node.js SDK ভার্সন 11.6.0 এবং তার পরবর্তী ভার্সনে কাজ করে।

  2. নিম্নলিখিত কমান্ড রান করুন:

    import { getAuth } from 'firebase-admin/auth';
    
    getAuth().projectConfigManager().updateProjectConfig(
    {
          multiFactorConfig: {
              providerConfigs: [{
                  state: "ENABLED",
                  totpProviderConfig: {
                      adjacentIntervals: NUM_ADJ_INTERVALS
                  }
              }]
          }
    })
    

    নিম্নলিখিতগুলি পরিবর্তন করুন:

    • NUM_ADJ_INTERVALS: শূন্য থেকে দশ পর্যন্ত, যেসব পাশাপাশি টাইম-উইন্ডো ইন্টারভ্যাল থেকে TOTP গ্রহণ করা হবে, সেগুলির সংখ্যা। ডিফল্ট হল পাঁচ।

      TOTP-এর কাজ হল, দুটি পক্ষ (প্রমাণকারী এবং যাচাইকারী) একই সময়সীমার মধ্যে (সাধারণত ৩০ সেকেন্ড দীর্ঘ) OTP জেনারেট করলে, তারা যাতে একই পাসওয়ার্ড জেনারেট করে তা নিশ্চিত করা। তবে, পার্টি ও হিউম্যান রেসপন্স টাইমের মধ্যে ঘড়ির ড্রিফ্ট অ্যাডজাস্ট করতে, আপনি TOTP পরিষেবা কনফিগার করতে পারেন যাতে সংলগ্ন উইন্ডো থেকেও TOTP গ্রহণ করা যায়।

REST API ব্যবহার করে TOTP MFA চালু করতে, নিম্নলিখিত কমান্ড রান করুন:

curl -X PATCH "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=mfa" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    -d \
    '{
        "mfa": {
          "providerConfigs": [{
            "state": "ENABLED",
            "totpProviderConfig": {
              "adjacentIntervals": NUM_ADJ_INTERVALS
            }
          }]
       }
    }'

নিম্নলিখিতগুলি পরিবর্তন করুন:

  • PROJECT_ID: প্রোজেক্ট আইডি।
  • NUM_ADJ_INTERVALS: টাইম-উইন্ডো ইন্টারভ্যালের সংখ্যা, শূন্য থেকে দশ পর্যন্ত। ডিফল্ট হল পাঁচটি।

    TOTP-এর কাজ হল, দুটি পক্ষ (প্রমাণকারী এবং যাচাইকারী) একই সময়সীমার মধ্যে (সাধারণত ৩০ সেকেন্ড দীর্ঘ) OTP জেনারেট করলে, তারা যাতে একই পাসওয়ার্ড জেনারেট করে তা নিশ্চিত করা। তবে, পার্টি ও হিউম্যান রেসপন্স টাইমের মধ্যে ঘড়ির ড্রিফ্ট অ্যাডজাস্ট করতে, আপনি TOTP পরিষেবা কনফিগার করতে পারেন যাতে সংলগ্ন উইন্ডো থেকেও TOTP গ্রহণ করা যায়।

এনরোলমেন্ট প্যাটার্ন বেছে নিন

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

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

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

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

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

TOTP MFA-তে ব্যবহারকারীদের এনরোল করুন

আপনার অ্যাপের জন্য দ্বিতীয় ফ্যাক্টর হিসেবে TOTP MFA চালু করার পরে, TOTP MFA-তে ব্যবহারকারীদের নথিভুক্ত করতে ক্লায়েন্ট-সাইড লজিক প্রয়োগ করুন:

  1. ব্যবহারকারীকে আবার যাচাইকরণ করুন।

  2. যাচাই করা ব্যবহারকারীর জন্য TOTP সিক্রেট জেনারেট করুন:

    // Generate a TOTP secret.
    Firebase.auth.currentUser.multiFactor.session
        .addOnSuccessListener { multiFactorSession ->
            TotpMultiFactorGenerator.generateSecret(multiFactorSession)
                .addOnSuccessListener { totpSecret ->
                    // Display the secret to the user and prompt them to
                    // enter it into their authenticator app. (See the next
                    // step.)
                }
        }
    
  3. ব্যবহারকারীকে গোপন কোডটি দেখান এবং তাদের যাচাইকারী অ্যাপে এটি লিখতে প্রম্পট করুন:

    // Display this key:
    val secret = totpSecret.sharedSecretKey
    

    গোপন কী দেখানোর পাশাপাশি, আপনি ডিভাইসের ডিফল্ট যাচাইকারী অ্যাপে এটি অটোমেটিক যোগ করার চেষ্টা করতে পারেন। এটি করতে, একটি Google Authenticator-এর সাথে মানানসই কী URI তৈরি করুন, এবং এটি openInOtpApp()-এ পাস করুন:

    val qrCodeUri = totpSecret.generateQrCodeUrl(
        currentUser.email ?: "default account",
        "Your App Name")
    totpSecret.openInOtpApp(qrCodeUri)
    

    ব্যবহারকারী তার যাচাইকারী অ্যাপে গোপন কী যোগ করার পরে, এটি TOTP জেনারেট করা শুরু করবে।

  4. ব্যবহারকারীকে তার যাচাইকারী অ্যাপের মাধ্যমে দেখানো TOTP টাইপ করতে প্রম্পট করুন এবং MFA এনরোলমেন্ট সম্পূর্ণ করতে এটি ব্যবহার করুন:

    // Ask the user for a verification code from the authenticator app.
    val verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    val multiFactorAssertion = TotpMultiFactorGenerator
        .getAssertionForEnrollment(totpSecret, verificationCode)
    Firebase.auth.currentUser.multiFactor.enroll(multiFactorAssertion, "TOTP")
        .addOnSuccessListener {
            // Enrollment complete.
        }
    

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

TOTP MFA-এর মাধ্যমে ব্যবহারকারীদের সাইন-ইন করাতে, নিম্নলিখিত কোড ব্যবহার করুন:

  1. আপনি MFA ব্যবহার না করলে যেভাবে করতেন, ঠিক সেভাবেই signInWith- পদ্ধতির যেকোনও একটি কল করুন। (যেমন, signInWithEmailAndPassword()।) পদ্ধতিটি যদি একটি FirebaseAuthMultiFactorException দেখায়, তাহলে আপনার অ্যাপের MFA ফ্লো শুরু করুন।

    Firebase.auth.signInWithEmailAndPassword(email, password)
        .addOnSuccessListener { result ->
            // If the user is not enrolled with a second factor and provided valid
            // credentials, sign-in succeeds.
    
            // (If your app requires MFA, this could be considered an error
            // condition, which you would resolve by forcing the user to enroll a
            // second factor.)
    
            // ...
        }
        .addOnFailureListener { exception ->
            when (exception) {
                is FirebaseAuthMultiFactorException -> {
                    // Initiate your second factor sign-in flow. (See next step.)
                    // ...
                }
            }
        }
    
  2. আপনার অ্যাপের MFA ফ্লোতে প্রথমে ব্যবহারকারীকে দ্বিতীয় ফ্যাক্টর বেছে নেওয়ার জন্য প্রম্পট করতে হবে যা তিনি ব্যবহার করতে চান। আপনি MultiFactorResolver ইনস্ট্যান্সের hints প্রপার্টি পরীক্ষা করে কাজ করে এমন সেকেন্ড ফ্যাক্টরের তালিকা পেতে পারেন:

    val enrolledFactors = exception.resolver.hints.map { it.displayName }
    
  3. ব্যবহারকারী TOTP ব্যবহার করার বিকল্প বেছে নিলে, তাকে যাচাইকারী অ্যাপে দেখানো TOTP টাইপ করতে এবং সাইন-ইন করার জন্য সেটি ব্যবহার করতে প্রম্পট করুন:

    when (exception.resolver.hints[selectedIndex].factorId) {
        TotpMultiFactorGenerator.FACTOR_ID -> {
            val otpFromAuthenticator = // OTP typed by the user.
            val assertion = TotpMultiFactorGenerator.getAssertionForSignIn(
                exception.resolver.hints[selectedIndex].uid,
                otpFromAuthenticator
            )
            exception.resolver.resolveSignIn(assertion)
                .addOnSuccessListener { result ->
                    // Successfully signed in!
                }
                .addOnFailureListener { resolveError ->
                    // Invalid or expired OTP.
                }
        }
        PhoneMultiFactorGenerator.FACTOR_ID -> {
            // Handle SMS second factor.
        }
    }
    

TOTP MFA থেকে নাম সরিয়ে নেওয়া

এই বিভাগে TOTP MFA থেকে ব্যবহারকারীর নাম প্রত্যাহার করার বিষয়টি কীভাবে ম্যানেজ করতে হয় তা বর্ণনা করা হয়েছে।

কোনও ব্যবহারকারী একাধিক MFA বিকল্পের জন্য সাইন-আপ করে থাকলে এবং সবচেয়ে সম্প্রতি চালু করা বিকল্প থেকে তিনি নাম সরিয়ে নিলে, তিনি একটি auth/user-token-expired পাবেন এবং লগ-আউট হয়ে যাবেন। ব্যবহারকারীকে আবার সাইন-ইন করতে হবে এবং তার আগে থেকে থাকা ক্রেডেনশিয়াল যাচাই করতে হবে—যেমন, ইমেল আইডি এবং পাসওয়ার্ড।

ব্যবহারকারীকে আনএনরোল করতে, সমস্যা সমাধান করতে এবং আবার যাচাইকরণ ট্রিগার করতে, নিম্নলিখিত কোড ব্যবহার করুন:

Firebase.auth.currentUser.multiFactor.unenroll(mfaEnrollmentId)
    .addOnSuccessListener {
        // Second factor unenrolled.
    }
    .addOnFailureListener { exception ->
        when (exception) {
            is FirebaseAuthInvalidUserException -> {
                // Second factor unenrolled. If the user was signed out, re-authenticate
                // them.

                // For example, if they signed in with a password, prompt them to
                // provide it again, then call `reauthenticateWithCredential()` as shown
                // below.
                val credential = EmailAuthProvider.getCredential(email, password)
                currentUser.reauthenticate(credential)
                    .addOnSuccessListener { 
                        // Success!
                    }
                    .addOnFailureListener { 
                        // Bad email address and password combination.
                    }
            }
        }
    }

এর পরে কী করতে হবে