ফোন নম্বর ব্যবহার করে Android-এ Firebase-এর মাধ্যমে যাচাইকরণ

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

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

শুরু করার আগে

  1. আপনি এখনও না করে থাকলে, আপনার Android প্রোজেক্টে Firebase যোগ করুন।
  2. আপনার মডিউল (অ্যাপ-লেভেল) Gradle ফাইলে (সাধারণত <project>/<app-module>/build.gradle.kts বা <project>/<app-module>/build.gradle), Android-এর জন্য Firebase Authentication লাইব্রেরির ডিপেন্ডেন্সি যোগ করুন। লাইব্রেরি ভার্সনিং কন্ট্রোল করতে Firebase Android BoM ব্যবহার করার সাজেশন দিই।
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:35.0.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 লাইব্রেরি নির্ভরতা যোগ করুন

    আপনি 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:25.0.0")
    }
  3. আপনি এখনও Firebase প্রোজেক্টের সাথে অ্যাপ কানেক্ট না করে থাকলে, এটি Firebase কনসোল থেকে করুন।
  4. আপনি যদি Firebase কনসোলে আগে থেকেই আপনার অ্যাপের SHA-1 হ্যাশ সেট না করে থাকেন, তাহলে তা করুন। আপনার অ্যাপের SHA-1 হ্যাশ খুঁজে পাওয়ার ব্যাপারে তথ্য পেতে, আপনার ক্লায়েন্টকে প্রমাণীকরণ করা দেখুন।

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

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

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

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

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

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

অ্যাপ যাচাইকরণ চালু করা

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

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

    Play Integrity ব্যবহার করতে, আপনার অ্যাপের SHA-256 ফিঙ্গারপ্রিন্ট নির্দিষ্ট করুন, যদি আপনি আগে থেকে না করে থাকেন।

    1. Firebase কনসোলে, সেটিংস > সাধারণ ট্যাব বিকল্পে যান।
    2. নিচের দিকে স্ক্রল করে আপনার অ্যাপ কার্ডে যান, আপনার Android অ্যাপ বেছে নিন এবং SHA সার্টিফিকেট ফিঙ্গারপ্রিন্ট ফিল্ডে আপনার SHA-256 ফিঙ্গারপ্রিন্ট যোগ করুন।

    আপনার অ্যাপের SHA ফিঙ্গারপ্রিন্ট কীভাবে পাবেন সেই বিষয়ে বিস্তারিত জানতে আপনার ক্লায়েন্টকে যাচাই করা লিঙ্কে যান।

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

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

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

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

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

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

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

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

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

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

তারপর, 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 পদ্ধতিটি দ্বিতীয় SMS পাঠাবে না, যদি না মূল অনুরোধের টাইম-আউট হয়ে যায়।

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

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

Firebase-এর পাঠানো এসএমএস মেসেজ আপনার Auth ইনস্ট্যান্সে setLanguageCode পদ্ধতির মাধ্যমে অনুমোদিত ভাষা নির্দিষ্ট করে লোকালও করা যেতে পারে।

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 ইমপ্লিমেন্ট করতে পারেন।

onVerificationCompleted(PhoneAuthCredential)

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

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

onVerificationFailed(FirebaseException)

ভুল যাচাইকরণের অনুরোধের উত্তরে এই পদ্ধতিটি কল করা হয়, যেমন এমন একটি অনুরোধ যা ভুল ফোন নম্বর বা যাচাইকরণ কোড নির্দিষ্ট করে।

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

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

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

onCodeAutoRetrievalTimeOut(String verificationId)

ঐচ্ছিক৷ এই পদ্ধতিটি নির্দিষ্ট করা টাইম-আউট সময়সীমা verifyPhoneNumber পেরিয়ে যাওয়ার পরে কল করা হয়, তবে onVerificationCompleted প্রথমবার ট্রিগার করা হয় না। সিম কার্ড নেই এমন ডিভাইসে এসএমএস অটোমেটিক ফিরিয়ে আনা সম্ভব নয় বলে এই পদ্ধতিটি সঙ্গে সঙ্গে কল করা হয়।

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

PhoneAuthCredential অবজেক্ট তৈরি করা

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

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

Kotlin

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

Java

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

ব্যবহারকারীকে সাইন-ইন করানো

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

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 কনসোল ব্যবহার করে কাল্পনিক ফোন নম্বর সেট-আপ করতে পারবেন। কাল্পনিক ফোন নম্বর দিয়ে পরীক্ষা করলে এইসব সুবিধা পাওয়া যায়:

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

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

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

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

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

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

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

আপনি কাল্পনিক ফোন নম্বর দিয়ে যাচাইকরণ কোড পাঠালে, কোনও আসল এসএমএস পাঠানো হয় না। পরিবর্তে, সাইন-ইন সম্পূর্ণ করতে আপনাকে আগে কনফিগার করা যাচাইকরণ কোডটি দিতে হবে।

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

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

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

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

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

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

Android-এ, signInWithPhoneNumber কল করার আগে setAppVerificationDisabledForTesting() নম্বরে কল করুন। এটি অটোমেটিক অ্যাপ যাচাইকরণ বন্ধ করে দেয়, ফলে আপনি ম্যানুয়ালি সমাধান না করেই ফোন নম্বর যাচাই করতে পারেন। Play Integrity ও reCAPTCHA বন্ধ করা থাকলেও, আসল ফোন নম্বর ব্যবহার করে সাইন-ইন সম্পূর্ণ করা যাবে না। এই API-এর সাথে শুধুমাত্র কাল্পনিক ফোন নম্বর ব্যবহার করা যাবে।

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

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

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)

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

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

Google Play Store-এ আপনার অ্যাপ্লিকেশন প্রকাশ করার সময় এটি বন্ধ আছে কিনা এবং আপনার অ্যাপে কোনও কাল্পনিক ফোন নম্বর হার্ডকোড করা নেই কিনা তা নিশ্চিত করুন।

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)

পরবর্তী ধাপ

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

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

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

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

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();