ফোন প্রমাণীকরণ

ফোন অথেন্টিকেশন ব্যবহারকারীদের তাদের ফোনকে অথেন্টিকেটর হিসেবে ব্যবহার করে ফায়ারবেসে সাইন ইন করার সুযোগ দেয়। ব্যবহারকারীর কাছে (প্রদত্ত ফোন নম্বরে) একটি অনন্য কোডসহ একটি এসএমএস বার্তা পাঠানো হয়। কোডটি অনুমোদিত হয়ে গেলে, ব্যবহারকারী ফায়ারবেসে সাইন ইন করতে পারেন।

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

ফায়ারবেস ফোন অথেন্টিকেশন সব দেশে সমর্থিত নয়। আরও তথ্যের জন্য অনুগ্রহ করে তাদের প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQs) দেখুন।

সেটআপ

ফোন প্রমাণীকরণ শুরু করার আগে, নিশ্চিত করুন যে আপনি এই ধাপগুলো অনুসরণ করেছেন:

  1. Firebase কনসোলে ফোনকে সাইন-ইন পদ্ধতি হিসেবে সক্রিয় করুন।
  2. অ্যান্ড্রয়েড : আপনি যদি ফায়ারবেস কনসোলে আপনার অ্যাপের SHA-1 হ্যাশ এখনও সেট না করে থাকেন, তবে তা করুন। আপনার অ্যাপের SHA-1 হ্যাশ খুঁজে বের করার বিষয়ে তথ্যের জন্য "আপনার ক্লায়েন্ট প্রমাণীকরণ" দেখুন।
  3. iOS : Xcode-এ, আপনার প্রোজেক্টের জন্য পুশ নোটিফিকেশন চালু করুন এবং নিশ্চিত করুন যে আপনার APNs অথেন্টিকেশন কী Firebase Cloud Messaging (FCM)-এর সাথে কনফিগার করা আছে। এছাড়াও, রিমোট নোটিফিকেশনের জন্য আপনাকে অবশ্যই ব্যাকগ্রাউন্ড মোড চালু করতে হবে। এই ধাপটির বিস্তারিত ব্যাখ্যার জন্য, Firebase iOS Phone Auth ডকুমেন্টেশন দেখুন।
  4. ওয়েব : নিশ্চিত করুন যে আপনি Firebase কনসোলে , 'OAuth redirect domains'-এর অধীনে আপনার অ্যাপ্লিকেশনের ডোমেইনটি যোগ করেছেন।

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

ব্যবহার

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

  • নেটিভ প্ল্যাটফর্ম : verifyPhoneNumber
  • ওয়েব প্ল্যাটফর্ম : signInWithPhoneNumber

স্থানীয়: verifyPhoneNumber

নেটিভ প্ল্যাটফর্মগুলিতে, প্রথমে ব্যবহারকারীর ফোন নম্বর যাচাই করতে হয় এবং তারপরে ব্যবহারকারী হয় সাইন-ইন করতে পারেন অথবা একটি PhoneAuthCredential ব্যবহার করে তাদের অ্যাকাউন্ট লিঙ্ক করতে পারেন।

প্রথমে আপনাকে ব্যবহারকারীর কাছে তার ফোন নম্বর চাইতে হবে। নম্বরটি দেওয়া হয়ে গেলে, verifyPhoneNumber() মেথডটি কল করুন:

await FirebaseAuth.instance.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) {},
  verificationFailed: (FirebaseAuthException e) {},
  codeSent: (String verificationId, int? resendToken) {},
  codeAutoRetrievalTimeout: (String verificationId) {},
);

এখানে ৪টি আলাদা কলব্যাক রয়েছে যা আপনাকে অবশ্যই হ্যান্ডেল করতে হবে, যার প্রত্যেকটি নির্ধারণ করবে আপনি কীভাবে অ্যাপ্লিকেশনটির UI আপডেট করবেন:

  1. যাচাইকরণ সম্পন্ন হয়েছে : অ্যান্ড্রয়েড ডিভাইসে এসএমএস কোডের স্বয়ংক্রিয় পরিচালনা।
  2. যাচাইকরণ ব্যর্থ : ভুল ফোন নম্বর অথবা এসএমএস কোটা অতিক্রম করার মতো ব্যর্থতার ঘটনাগুলো সামাল দিন।
  3. codeSent : যখন Firebase থেকে ডিভাইসে কোনো কোড পাঠানো হয়, তখন ব্যবহারকারীদের কোডটি প্রবেশ করানোর জন্য অনুরোধ জানাতে এটি ব্যবহৃত হয়।
  4. codeAutoRetrievalTimeout : স্বয়ংক্রিয় এসএমএস কোড হ্যান্ডলিং ব্যর্থ হলে তার টাইমআউট পরিচালনা করার জন্য।

যাচাইকরণ সম্পন্ন হয়েছে

এই হ্যান্ডলারটি শুধুমাত্র সেইসব অ্যান্ড্রয়েড ডিভাইসে কল করা হবে যেগুলো স্বয়ংক্রিয় এসএমএস কোড সমাধান সমর্থন করে।

যখন ডিভাইসে এসএমএস কোডটি পাঠানো হয়, তখন অ্যান্ড্রয়েড ব্যবহারকারীকে ম্যানুয়ালি কোডটি ইনপুট করার প্রয়োজন ছাড়াই স্বয়ংক্রিয়ভাবে তা যাচাই করে নেয়। এই ঘটনাটি ঘটলে, স্বয়ংক্রিয়ভাবে একটি PhoneAuthCredential প্রদান করা হয়, যা ব্যবহার করে ব্যবহারকারীর ফোন নম্বর দিয়ে সাইন-ইন করা বা লিঙ্ক করা যায়।

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) async {
    // ANDROID ONLY!

    // Sign the user in (or link) with the auto-generated credential
    await auth.signInWithCredential(credential);
  },
);

যাচাইকরণ ব্যর্থ হয়েছে

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

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationFailed: (FirebaseAuthException e) {
    if (e.code == 'invalid-phone-number') {
      print('The provided phone number is not valid.');
    }

    // Handle other errors
  },
);

কোড পাঠানো হয়েছে

যখন Firebase ডিভাইসে একটি SMS কোড পাঠায়, তখন এই হ্যান্ডলারটি একটি verificationId এবং resendToken এর মাধ্যমে ট্রিগার হয় ( resendToken শুধুমাত্র Android ডিভাইসে সমর্থিত, iOS ডিভাইস সর্বদা একটি null ভ্যালু রিটার্ন করবে)।

একবার চালু হলে, ব্যবহারকারীকে প্রত্যাশিত এসএমএস কোডটি প্রবেশ করানোর জন্য অনুরোধ জানাতে আপনার অ্যাপ্লিকেশনের UI আপডেট করার এটি একটি ভালো সময় হবে। এসএমএস কোডটি প্রবেশ করানো হয়ে গেলে, আপনি ভেরিফিকেশন আইডি-র সাথে এসএমএস কোডটি একত্রিত করে একটি নতুন PhoneAuthCredential তৈরি করতে পারেন।

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  codeSent: (String verificationId, int? resendToken) async {
    // Update the UI - wait for the user to enter the SMS code
    String smsCode = 'xxxx';

    // Create a PhoneAuthCredential with the code
    PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);

    // Sign the user in (or link) with the credential
    await auth.signInWithCredential(credential);
  },
);

ডিফল্টরূপে, সম্প্রতি পাঠানো কোনো এসএমএস বার্তা ফায়ারবেস পুনরায় পাঠায় না। তবে, `resend token` সহ ` forceResendingToken আর্গুমেন্ট ব্যবহার করে ` verifyPhoneNumber মেথডটি পুনরায় কল করার মাধ্যমে আপনি এই আচরণটি পরিবর্তন করতে পারেন। সফল হলে, এসএমএস বার্তাটি পুনরায় পাঠানো হবে।

কোডঅটোরিট্রিভালটাইমআউট

যেসব অ্যান্ড্রয়েড ডিভাইসে স্বয়ংক্রিয় এসএমএস কোড সমাধান (automatic SMS code resolution) সুবিধা আছে, সেগুলোতে একটি নির্দিষ্ট সময়সীমার মধ্যে ডিভাইসটি যদি স্বয়ংক্রিয়ভাবে কোনো এসএমএস বার্তা সমাধান করতে না পারে, তবে এই হ্যান্ডলারটি কল করা হবে। সময়সীমাটি পার হয়ে গেলে, ডিভাইসটি আর কোনো আগত বার্তা সমাধান করার চেষ্টা করবে না।

ডিফল্টরূপে, ডিভাইসটি ৩০ সেকেন্ড অপেক্ষা করে, তবে timeout আর্গুমেন্টের মাধ্যমে এটি কাস্টমাইজ করা যায়:

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  timeout: const Duration(seconds: 60),
  codeAutoRetrievalTimeout: (String verificationId) {
    // Auto-resolution timed out...
  },
);

ওয়েব: signInWithPhoneNumber

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

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

FirebaseAuth auth = FirebaseAuth.instance;

// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');

মেথডটি কল করলে প্রথমে reCAPTCHA উইজেটটি প্রদর্শিত হবে। এসএমএস কোড পাঠানোর আগে ব্যবহারকারীকে অবশ্যই পরীক্ষাটি সম্পন্ন করতে হবে। একবার সম্পন্ন হলে, আপনি রিজলভড ConfirmationResult রেসপন্সের confirm মেথডে এসএমএস কোডটি দিয়ে ব্যবহারকারীকে সাইন ইন করাতে পারবেন:

UserCredential userCredential = await confirmationResult.confirm('123456');

অন্যান্য সাইন-ইন প্রক্রিয়ার মতোই, সফল সাইন-ইন আপনার অ্যাপ্লিকেশন জুড়ে সাবস্ক্রাইব করা যেকোনো অথেনটিকেশন স্টেট লিসেনারকে সক্রিয় করবে।

reCAPTCHA কনফিগারেশন

reCAPTCHA উইজেটটি একটি সম্পূর্ণরূপে পরিচালিত ফ্লো, যা আপনার ওয়েব অ্যাপ্লিকেশনকে নিরাপত্তা প্রদান করে।

signInWithPhoneNumber এর দ্বিতীয় আর্গুমেন্টটি একটি ঐচ্ছিক RecaptchaVerifier ইনস্ট্যান্স গ্রহণ করে, যা উইজেটটি পরিচালনা করতে ব্যবহার করা যেতে পারে। ডিফল্টরূপে, সাইন-ইন প্রক্রিয়াটি চালু হলে উইজেটটি একটি অদৃশ্য উইজেট হিসেবে রেন্ডার হবে। একটি "অদৃশ্য" উইজেট আপনার অ্যাপ্লিকেশনের উপরে একটি পূর্ণ-পৃষ্ঠার মোডাল হিসেবে প্রদর্শিত হবে।

তবে একটি ইনলাইন উইজেট প্রদর্শন করা সম্ভব, যেটি ব্যবহারকারীকে নিজেকে যাচাই করার জন্য স্পষ্টভাবে চাপতে হয়।

একটি ইনলাইন উইজেট যোগ করতে, RecaptchaVerifier ইনস্ট্যান্সের container আর্গুমেন্টে একটি DOM এলিমেন্ট আইডি উল্লেখ করুন। এলিমেন্টটির অস্তিত্ব থাকতে হবে এবং এটি খালি হতে হবে, অন্যথায় একটি ত্রুটি দেখানো হবে। যদি কোনো container আর্গুমেন্ট প্রদান করা না হয়, তাহলে উইজেটটি "অদৃশ্য" হিসেবে রেন্ডার করা হবে।

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

আপনি চাইলে উপরে দেখানো পদ্ধতি অনুযায়ী size এবং theme আর্গুমেন্টগুলো কাস্টমাইজ করে সাইজ ও থিম পরিবর্তন করতে পারেন।

এছাড়াও বিভিন্ন ইভেন্ট শোনা সম্ভব, যেমন ব্যবহারকারী reCAPTCHA পূরণ করেছেন কিনা, reCAPTCHA-এর মেয়াদ শেষ হয়ে গেছে কিনা বা কোনো ত্রুটি দেখা দিয়েছে কিনা:

RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);

পরীক্ষা

ফায়ারবেস স্থানীয়ভাবে ফোন নম্বর পরীক্ষা করার সুবিধা প্রদান করে:

  1. Firebase Console-এ, "Phone" অথেনটিকেশন প্রোভাইডারটি নির্বাচন করুন এবং "Phone numbers for testing" ড্রপডাউনটিতে ক্লিক করুন।
  2. একটি নতুন ফোন নম্বর (যেমন +44 7444 555666 ) এবং একটি টেস্ট কোড (যেমন 123456 ) প্রবেশ করান।

verifyPhoneNumber বা signInWithPhoneNumber মেথডগুলোতে কোনো টেস্ট ফোন নম্বর দিলে, আসলে কোনো এসএমএস পাঠানো হবে না। এর পরিবর্তে আপনি টেস্ট কোডটি সরাসরি PhoneAuthProvider এ অথবা signInWithPhoneNumber এর কনফার্মেশন রেজাল্ট হ্যান্ডলারের সাথে দিতে পারেন।