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

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

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

ফায়ারবেস ফোন প্রমাণীকরণ সব দেশে সমর্থিত নয়। আরো তথ্যের জন্য তাদের FAQ দেখুন দয়া করে.

সেটআপ

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

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

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

ব্যবহার

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

  • নেটিভ প্ল্যাটফর্ম : 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) {},
);

4টি পৃথক কলব্যাক রয়েছে যা আপনাকে অবশ্যই পরিচালনা করতে হবে, প্রতিটি নির্ধারণ করবে আপনি কীভাবে অ্যাপ্লিকেশন UI আপডেট করবেন:

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

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

এই হ্যান্ডলারটি শুধুমাত্র Android ডিভাইসগুলিতে কল করা হবে যা স্বয়ংক্রিয় SMS কোড রেজোলিউশন সমর্থন করে৷

যখন এসএমএস কোডটি ডিভাইসে বিতরণ করা হয়, তখন ব্যবহারকারীকে ম্যানুয়ালি কোড ইনপুট করার প্রয়োজন না করে Android স্বয়ংক্রিয়ভাবে SMS কোডটি যাচাই করবে৷ এই ইভেন্টটি ঘটলে, একটি 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);
  },
);

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

যদি Firebase একটি ত্রুটি ফেরত দেয়, উদাহরণস্বরূপ একটি ভুল ফোন নম্বরের জন্য বা যদি প্রকল্পের এসএমএস কোটা অতিক্রম করে থাকে, তাহলে এই হ্যান্ডলারে একটি 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
  },
);

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

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

একবার ট্রিগার হয়ে গেলে, ব্যবহারকারীকে তাদের প্রত্যাশা করা SMS কোডটি প্রবেশ করতে অনুরোধ করার জন্য আপনার অ্যাপ্লিকেশন 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);
  },
);

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

codeAutoRetrievalTimeout

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

ডিফল্টরূপে, ডিভাইসটি 30 সেকেন্ডের জন্য অপেক্ষা করে তবে এটি 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

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

Flutter-এর জন্য Firebase প্রমাণীকরণ SDK ডিফল্টরূপে বক্সের বাইরে 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 উইজেটটি প্রদর্শনের জন্য ট্রিগার হবে। একটি SMS কোড পাঠানোর আগে ব্যবহারকারীকে অবশ্যই পরীক্ষাটি সম্পূর্ণ করতে হবে। একবার সম্পূর্ণ হয়ে গেলে, আপনি সমাধানকৃত ConfirmationResult প্রতিক্রিয়ায় confirm পদ্ধতিতে SMS কোড প্রদান করে ব্যবহারকারীকে সাইন ইন করতে পারেন:

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!'),
);

টেস্টিং

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

  1. Firebase কনসোলে, "ফোন" প্রমাণীকরণ প্রদানকারী নির্বাচন করুন এবং "পরীক্ষার জন্য ফোন নম্বর" ড্রপডাউনে ক্লিক করুন।
  2. একটি নতুন ফোন নম্বর লিখুন (যেমন +44 7444 555666 ) এবং একটি পরীক্ষার কোড (যেমন 123456 )।

verifyPhoneNumber বা signInWithPhoneNumber পদ্ধতিতে একটি টেস্ট ফোন নম্বর প্রদান করলে, আসলে কোনো SMS পাঠানো হবে না। আপনি পরিবর্তে সরাসরি PhoneAuthProvider বা signInWithPhoneNumber এর নিশ্চিতকরণ ফলাফল হ্যান্ডলারের সাথে পরীক্ষার কোড প্রদান করতে পারেন।