একটি ফোন নম্বর ব্যবহার করে Android এ Firebase দিয়ে প্রমাণীকরণ করুন

আপনি ব্যবহারকারীর ফোনে একটি এসএমএস বার্তা পাঠিয়ে Firebase Authentication ব্যবহার করে তাকে সাইন ইন করাতে পারেন। ব্যবহারকারী এসএমএস বার্তায় থাকা একটি ওয়ান-টাইম কোড ব্যবহার করে সাইন ইন করেন।

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

শুরু করার আগে

  1. যদি আগে থেকে না করে থাকেন, তাহলে আপনার অ্যান্ড্রয়েড প্রজেক্টে ফায়ারবেস যোগ করুন
  2. আপনার মডিউল (অ্যাপ-লেভেল) গ্রেডল ফাইলে (সাধারণত <project>/<app-module>/build.gradle.kts অথবা <project>/<app-module>/build.gradle ), অ্যান্ড্রয়েডের জন্য Firebase Authentication লাইব্রেরির ডিপেন্ডেন্সি যোগ করুন। লাইব্রেরির ভার্সনিং নিয়ন্ত্রণের জন্য আমরা Firebase Android BoM ব্যবহার করার পরামর্শ দিই।
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.10.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    Firebase Android BoM ব্যবহার করলে, আপনার অ্যাপ সর্বদা Firebase Android লাইব্রেরিগুলোর সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করবে।

    (বিকল্প) BoM ব্যবহার না করে ফায়ারবেস লাইব্রেরি নির্ভরতা যোগ করুন

    আপনি যদি Firebase BoM ব্যবহার না করার সিদ্ধান্ত নেন, তাহলে আপনাকে প্রতিটি Firebase লাইব্রেরির ভার্সন তার ডিপেন্ডেন্সি লাইনে উল্লেখ করতে হবে।

    মনে রাখবেন, আপনি যদি আপনার অ্যাপে একাধিক Firebase লাইব্রেরি ব্যবহার করেন, তাহলে আমরা লাইব্রেরির ভার্সনগুলো পরিচালনা করার জন্য BoM অফ মেটেরিয়ালস) ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করি, যা সব ভার্সনের সামঞ্জস্যতা নিশ্চিত করে।

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:24.0.1")
    }
  3. আপনি যদি এখনও আপনার অ্যাপটিকে আপনার ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত না করে থাকেন, তাহলে Firebase কনসোল থেকে তা করে নিন।
  4. আপনি যদি ইতিমধ্যেই Firebase কনসোলে আপনার অ্যাপের SHA-1 হ্যাশ সেট না করে থাকেন, তবে তা করুন। আপনার অ্যাপের SHA-1 হ্যাশ খুঁজে বের করার বিষয়ে তথ্যের জন্য ‘আপনার ক্লায়েন্ট প্রমাণীকরণ’ দেখুন।

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

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

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

আপনার ফায়ারবেস প্রোজেক্টের জন্য ফোন নম্বর দিয়ে সাইন-ইন চালু করুন।

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

  1. Firebase কনসোলে , Authentication সেকশনটি খুলুন।
  2. সাইন-ইন পদ্ধতি পেজে, ফোন নম্বর দিয়ে সাইন-ইন করার পদ্ধতিটি সক্রিয় করুন।
  3. সেটিংস পৃষ্ঠায়, আপনি কোন কোন অঞ্চলে এসএমএস বার্তা পাঠানোর অনুমতি দিতে বা অস্বীকার করতে চান, সে বিষয়ে একটি নীতি নির্ধারণ করুন। নতুন প্রোজেক্টের জন্য, ডিফল্ট নীতি অনুযায়ী কোনো অঞ্চলের অনুমতি নেই।

অ্যাপ যাচাইকরণ সক্ষম করুন

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

  • প্লে ইন্টিগ্রিটি এপিআই : যদি কোনো ব্যবহারকারীর ডিভাইসে Google Play services ইনস্টল করা থাকে এবং Firebase Authentication প্লে ইন্টিগ্রিটি এপিআই ব্যবহার করে ডিভাইসটিকে বৈধ হিসেবে যাচাই করতে পারে, তবে ফোন নম্বর দিয়ে সাইন-ইন করা যাবে। প্লে ইন্টিগ্রিটি এপিআই আপনার প্রোজেক্টে নয়, বরং Firebase Authentication দ্বারা গুগলের মালিকানাধীন প্রোজেক্টে সক্রিয় করা হয়। এটি আপনার প্রোজেক্টের কোনো প্লে ইন্টিগ্রিটি এপিআই কোটায় যোগ হয় না। প্লে ইন্টিগ্রিটি সাপোর্ট Authentication এসডিকে v21.2.0+ ( Firebase BoM v31.4.0+) এর সাথে উপলব্ধ।

    প্লে ইন্টিগ্রিটি ব্যবহার করার জন্য, আপনি যদি এখনও আপনার অ্যাপের SHA-256 ফিঙ্গারপ্রিন্ট নির্দিষ্ট না করে থাকেন, তবে Firebase কনসোলের প্রজেক্ট সেটিংস থেকে তা করুন। আপনার অ্যাপের SHA-256 ফিঙ্গারপ্রিন্ট কীভাবে পাবেন সে সম্পর্কে বিস্তারিত জানতে "আপনার ক্লায়েন্টকে প্রমাণীকরণ" অংশটি দেখুন।

  • reCAPTCHA যাচাইকরণ : যদি প্লে ইন্টিগ্রিটি (Play Integrity) ব্যবহার করা না যায়, যেমন যখন কোনো ব্যবহারকারীর ডিভাইসে Google Play services ইনস্টল করা থাকে না , তখন ফোন সাইন-ইন প্রক্রিয়াটি সম্পন্ন করার জন্য Firebase Authentication একটি reCAPTCHA যাচাইকরণ ব্যবহার করে। এই reCAPTCHA চ্যালেঞ্জটি প্রায়শই ব্যবহারকারীকে কোনো কিছু সমাধান না করেই সম্পন্ন করা যায়। মনে রাখবেন যে, এই প্রক্রিয়াটির জন্য আপনার অ্যাপ্লিকেশনের সাথে একটি SHA-1 যুক্ত থাকা আবশ্যক। এছাড়াও, এই প্রক্রিয়াটির জন্য PROJECT_ID .firebaseapp.com এর জন্য আপনার এপিআই কী (API Key) আনরেস্ট্রিকটেড (unrestricted) বা অ্যালাউলিস্টেড (allowlisted) হওয়া প্রয়োজন।

    কিছু পরিস্থিতি যেখানে reCAPTCHA সক্রিয় হয়:

    • যদি ব্যবহারকারীর ডিভাইসে Google Play services ইনস্টল করা না থাকে।
    • যদি অ্যাপটি Google Play Store মাধ্যমে বিতরণ করা না হয় ( Authentication এসডিকে v21.2.0+ এ )।
    • যদি প্রাপ্ত SafetyNet টোকেনটি বৈধ না হয় ( Authentication SDK ভার্সন < v21.2.0-এর ক্ষেত্রে)।

    যখন অ্যাপ যাচাইকরণের জন্য SafetyNet বা Play Integrity ব্যবহার করা হয়, তখন SMS টেমপ্লেটের %APP_NAME% ফিল্ডটি Google Play Store থেকে নির্ধারিত অ্যাপের নাম দিয়ে পূরণ করা হয়। যেসব ক্ষেত্রে reCAPTCHA সক্রিয় হয়, সেখানে %APP_NAME% PROJECT_ID .firebaseapp.com দিয়ে পূরণ করা হয়।

আপনি forceRecaptchaFlowForTesting ব্যবহার করে reCAPTCHA যাচাইকরণ প্রক্রিয়াটি বাধ্যতামূলক করতে পারেন। আপনি setAppVerificationDisabledForTesting ব্যবহার করে অ্যাপ যাচাইকরণ নিষ্ক্রিয় করতে পারেন (কাল্পনিক ফোন নম্বর ব্যবহার করার সময়)।

সমস্যা সমাধান

  • অ্যাপ যাচাইকরণের জন্য reCAPTCHA ব্যবহার করার সময় "প্রাথমিক অবস্থা অনুপস্থিত" ত্রুটি।

    এটি তখন ঘটতে পারে যখন reCAPTCHA ফ্লো সফলভাবে সম্পন্ন হলেও ব্যবহারকারীকে নেটিভ অ্যাপ্লিকেশনে ফেরত পাঠায় না। এমনটি ঘটলে, ব্যবহারকারীকে ফলব্যাক URL PROJECT_ID .firebaseapp.com/__/auth/handler এ রিডাইরেক্ট করা হয়। ফায়ারফক্স ব্রাউজারে, নেটিভ অ্যাপ লিঙ্ক খোলা ডিফল্টরূপে নিষ্ক্রিয় থাকে। আপনি যদি ফায়ারফক্সে উপরের ত্রুটিটি দেখতে পান, তাহলে অ্যাপ লিঙ্ক খোলা সক্রিয় করতে "Set Firefox for Android to open links in native apps"- এর ধাপগুলো অনুসরণ করুন।

ব্যবহারকারীর ফোনে একটি যাচাইকরণ কোড পাঠান

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

এরপর, ব্যবহারকারীর ফোন নম্বর যাচাই করার জন্য Firebase-কে অনুরোধ জানাতে তাদের ফোন নম্বরটি PhoneAuthProvider.verifyPhoneNumber মেথডে পাঠান। উদাহরণস্বরূপ:

Kotlin

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

verifyPhoneNumber মেথডটি রিয়েন্ট্র্যান্ট: অর্থাৎ, যদি আপনি এটিকে একাধিকবার কল করেন, যেমন কোনো অ্যাক্টিভিটির onStart মেথডে, তাহলে মূল অনুরোধটির সময়সীমা শেষ না হওয়া পর্যন্ত verifyPhoneNumber মেথডটি দ্বিতীয় কোনো এসএমএস পাঠাবে না।

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

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

আপনার Auth ইনস্ট্যান্সের setLanguageCode মেথডের মাধ্যমে অথোরাইজেশন ভাষা নির্দিষ্ট করে দিয়ে Firebase থেকে পাঠানো SMS মেসেজকেও স্থানীয়করণ করা যায়।

Kotlin

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

যখন আপনি PhoneAuthProvider.verifyPhoneNumber কল করেন, তখন আপনাকে অবশ্যই OnVerificationStateChangedCallbacks এর একটি ইনস্ট্যান্সও প্রদান করতে হবে, যেটিতে অনুরোধের ফলাফল পরিচালনা করে এমন কলব্যাক ফাংশনগুলির ইমপ্লিমেন্টেশন থাকে। উদাহরণস্বরূপ:

Kotlin

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

যাচাইকরণ কলব্যাক

বেশিরভাগ অ্যাপে, আপনাকে onVerificationCompleted , onVerificationFailed , এবং onCodeSent কলব্যাকগুলো ইমপ্লিমেন্ট করতে হয়। আপনার অ্যাপের প্রয়োজনীয়তার ওপর নির্ভর করে, আপনি onCodeAutoRetrievalTimeOut ও ইমপ্লিমেন্ট করতে পারেন।

যাচাইকরণ সম্পন্ন হয়েছে (ফোন প্রমাণীকরণ শংসাপত্র)

এই পদ্ধতিটি দুটি পরিস্থিতিতে আহ্বান করা হয়:

  • তাৎক্ষণিক যাচাইকরণ: কিছু ক্ষেত্রে, কোনো যাচাইকরণ কোড পাঠানো বা প্রবেশ করানো ছাড়াই ফোন নম্বরটি তাৎক্ষণিকভাবে যাচাই করা যায়।
  • স্বয়ংক্রিয় পুনরুদ্ধার: কিছু ডিভাইসে, গুগল প্লে পরিষেবা ব্যবহারকারীর কোনো হস্তক্ষেপ ছাড়াই আগত যাচাইকরণ এসএমএস স্বয়ংক্রিয়ভাবে শনাক্ত করতে এবং যাচাইকরণ সম্পন্ন করতে পারে। (এই সুবিধাটি কিছু ক্যারিয়ারের ক্ষেত্রে উপলব্ধ নাও থাকতে পারে।) এটি এসএমএস রিট্রিভার এপিআই (SMS Retriever API) ব্যবহার করে, যা এসএমএস বার্তার শেষে একটি ১১ অক্ষরের হ্যাশ অন্তর্ভুক্ত করে।
উভয় ক্ষেত্রেই, ব্যবহারকারীর ফোন নম্বর সফলভাবে যাচাই করা হয়েছে, এবং আপনি ব্যবহারকারীকে সাইন ইন করতে কলব্যাকে পাঠানো PhoneAuthCredential অবজেক্টটি ব্যবহার করতে পারেন।

যাচাইকরণ ব্যর্থ হয়েছে (ফায়ারবেস ব্যতিক্রম)

এই মেথডটি কোনো অবৈধ যাচাইকরণ অনুরোধের জবাবে কল করা হয়, যেমন এমন কোনো অনুরোধ যেখানে একটি অবৈধ ফোন নম্বর বা যাচাইকরণ কোড উল্লেখ করা থাকে।

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

ঐচ্ছিক। প্রদত্ত ফোন নম্বরে এসএমএস-এর মাধ্যমে যাচাইকরণ কোড পাঠানোর পর এই পদ্ধতিটি কল করা হয়।

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

onCodeAutoRetrievalTimeOut(String verificationId)

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

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

একটি PhoneAuthCredential অবজেক্ট তৈরি করুন

ফায়ারবেস ব্যবহারকারীর ফোনে যে ভেরিফিকেশন কোডটি পাঠিয়েছে, সেটি প্রবেশ করানোর পর, onCodeSent বা onCodeAutoRetrievalTimeOut কলব্যাকে পাঠানো ভেরিফিকেশন কোড এবং ভেরিফিকেশন আইডি ব্যবহার করে একটি PhoneAuthCredential অবজেক্ট তৈরি করুন। (যখন onVerificationCompleted কল করা হয়, তখন আপনি সরাসরি একটি PhoneAuthCredential অবজেক্ট পেয়ে যান, তাই আপনি এই ধাপটি এড়িয়ে যেতে পারেন।)

PhoneAuthCredential অবজেক্টটি তৈরি করতে, PhoneAuthProvider.getCredential কল করুন:

Kotlin

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

ব্যবহারকারী সাইন ইন করুন

onVerificationCompleted কলব্যাকে অথবা PhoneAuthProvider.getCredential কল করার মাধ্যমে একটি PhoneAuthCredential অবজেক্ট পাওয়ার পর, FirebaseAuth.signInWithCredentialPhoneAuthCredential অবজেক্টটি পাস করে সাইন-ইন প্রক্রিয়াটি সম্পূর্ণ করুন:

Kotlin

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

কাল্পনিক ফোন নম্বর দিয়ে পরীক্ষা করুন

আপনি Firebase কনসোলের মাধ্যমে ডেভেলপমেন্টের জন্য কাল্পনিক ফোন নম্বর সেট আপ করতে পারেন। কাল্পনিক ফোন নম্বর দিয়ে পরীক্ষা করার নিম্নলিখিত সুবিধাগুলো রয়েছে:

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

কাল্পনিক ফোন নম্বরগুলোকে অবশ্যই এই শর্তগুলো পূরণ করতে হবে:

  1. নিশ্চিত করুন যে আপনি এমন ফোন নম্বর ব্যবহার করছেন যা সত্যিই কাল্পনিক এবং আগে থেকে বিদ্যমান নয়। Firebase Authentication আপনাকে আসল ব্যবহারকারীদের ব্যবহৃত বিদ্যমান ফোন নম্বরগুলোকে টেস্ট নম্বর হিসেবে সেট করার অনুমতি দেয় না। একটি উপায় হলো মার্কিন টেস্ট ফোন নম্বর হিসেবে 555 প্রিফিক্সযুক্ত নম্বর ব্যবহার করা, যেমন: +1 650-555-3434
  2. ফোন নম্বরগুলোকে দৈর্ঘ্য এবং অন্যান্য সীমাবদ্ধতা মেনে সঠিকভাবে ফরম্যাট করতে হবে। তবুও এগুলো একজন প্রকৃত ব্যবহারকারীর ফোন নম্বরের মতোই একই যাচাইকরণ প্রক্রিয়ার মধ্য দিয়ে যাবে।
  3. উন্নয়নের জন্য আপনি সর্বোচ্চ ১০টি ফোন নম্বর যোগ করতে পারেন।
  4. এমন পরীক্ষামূলক ফোন নম্বর বা কোড ব্যবহার করুন যা অনুমান করা কঠিন এবং সেগুলো ঘন ঘন পরিবর্তন করুন।

কাল্পনিক ফোন নম্বর এবং যাচাইকরণ কোড তৈরি করুন

  1. Firebase কনসোলে , Authentication সেকশনটি খুলুন।
  2. সাইন ইন পদ্ধতি ট্যাবে, ফোন প্রদানকারীকে সক্রিয় করুন, যদি আগে থেকে তা করা না থাকে।
  3. পরীক্ষার জন্য ফোন নম্বরগুলোর অ্যাকর্ডিয়ন মেনুটি খুলুন।
  4. যে ফোন নম্বরটি পরীক্ষা করতে চান, সেটি দিন, যেমন: +1 650-555-3434
  5. ওই নির্দিষ্ট নম্বরটির জন্য ৬-সংখ্যার যাচাইকরণ কোডটি প্রদান করুন, উদাহরণস্বরূপ: ৬৫৪৩২১
  6. নম্বরটি যোগ করুন । প্রয়োজনে, সংশ্লিষ্ট সারির উপর মাউস রেখে ট্র্যাশ আইকনে ক্লিক করে ফোন নম্বর এবং এর কোডটি মুছে ফেলতে পারেন।

ম্যানুয়াল টেস্টিং

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

আপনি যখন কাল্পনিক ফোন নম্বরটি দিয়ে ভেরিফিকেশন কোড পাঠান, তখন কোনো প্রকৃত এসএমএস পাঠানো হয় না। এর পরিবর্তে, সাইন ইন সম্পন্ন করার জন্য আপনাকে পূর্বে সেট করা ভেরিফিকেশন কোডটি প্রদান করতে হবে।

সাইন-ইন সম্পন্ন হলে, সেই ফোন নম্বরটি দিয়ে একটি ফায়ারবেস ব্যবহারকারী তৈরি হয়। এই ব্যবহারকারীর আচরণ ও বৈশিষ্ট্য একজন আসল ফোন নম্বর ব্যবহারকারীর মতোই হয় এবং তিনি একইভাবে Realtime Database / Cloud Firestore ও অন্যান্য পরিষেবা অ্যাক্সেস করতে পারেন। এই প্রক্রিয়ার সময় তৈরি হওয়া আইডি টোকেনটির সিগনেচার একজন আসল ফোন নম্বর ব্যবহারকারীর সিগনেচারের মতোই হয়।

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

পরীক্ষার জন্য ম্যানুয়ালি reCAPTCHA ফ্লো চালু করতে, forceRecaptchaFlowForTesting() মেথডটি ব্যবহার করুন।

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

ইন্টিগ্রেশন টেস্টিং

ম্যানুয়াল টেস্টিং ছাড়াও, ফোন অথেন্টিকেশন টেস্টিংয়ের জন্য ইন্টিগ্রেশন টেস্ট লিখতে সাহায্য করার উদ্দেশ্যে Firebase Authentication এপিআই (API) প্রদান করে। এই এপিআইগুলো ওয়েবে reCAPTCHA-এর আবশ্যকতা এবং iOS-এ সাইলেন্ট পুশ নোটিফিকেশন নিষ্ক্রিয় করার মাধ্যমে অ্যাপ ভেরিফিকেশন বন্ধ করে দেয়। এর ফলে এই ফ্লোগুলোতে অটোমেশন টেস্টিং সম্ভব হয় এবং তা বাস্তবায়ন করাও সহজ হয়। এছাড়াও, এগুলো অ্যান্ড্রয়েডে ইনস্ট্যান্ট ভেরিফিকেশন ফ্লো পরীক্ষা করার সক্ষমতা প্রদানে সাহায্য করে।

অ্যান্ড্রয়েডে, signInWithPhoneNumber কল করার আগে setAppVerificationDisabledForTesting() কল করুন। এটি স্বয়ংক্রিয়ভাবে অ্যাপ ভেরিফিকেশন নিষ্ক্রিয় করে দেয়, ফলে আপনাকে ম্যানুয়ালি সমাধান না করেই ফোন নম্বরটি পাস করার সুযোগ দেয়। প্লে ইন্টিগ্রিটি এবং রিক্যাপচা নিষ্ক্রিয় থাকলেও, আসল ফোন নম্বর ব্যবহার করে সাইন ইন সম্পন্ন করা যাবে না। এই এপিআই-এর সাথে শুধুমাত্র কাল্পনিক ফোন নম্বর ব্যবহার করা যাবে।

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

একটি কাল্পনিক নম্বর দিয়ে verifyPhoneNumber কল করলে onCodeSent কলব্যাকটি ট্রিগার হয়, যেখানে আপনাকে সংশ্লিষ্ট ভেরিফিকেশন কোডটি প্রদান করতে হবে। এর ফলে অ্যান্ড্রয়েড এমুলেটরগুলিতে পরীক্ষা করা যায়।

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

এছাড়াও, setAutoRetrievedSmsCodeForPhoneNumber কল করে অটো-রিট্রিভালের জন্য কাল্পনিক নম্বর এবং এর সংশ্লিষ্ট যাচাইকরণ কোড সেট করার মাধ্যমে আপনি অ্যান্ড্রয়েডে অটো-রিট্রিভাল ফ্লো পরীক্ষা করতে পারেন।

যখন verifyPhoneNumber কল করা হয়, তখন এটি সরাসরি PhoneAuthCredential ব্যবহার করে onVerificationCompleted ট্রিগার করে। এটি শুধুমাত্র কাল্পনিক ফোন নম্বরের ক্ষেত্রেই কাজ করে।

গুগল প্লে স্টোরে আপনার অ্যাপ্লিকেশনটি প্রকাশ করার সময় নিশ্চিত করুন যে এটি নিষ্ক্রিয় করা আছে এবং আপনার অ্যাপে কোনো কাল্পনিক ফোন নম্বর হার্ডকোড করা নেই।

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

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

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

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

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

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

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();