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

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

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

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

সেটআপ

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

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

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

ব্যবহার

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

  • নেটিভ প্ল্যাটফর্ম : 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 : স্বয়ংক্রিয় SMS কোড হ্যান্ডলিং ব্যর্থ হলে একটি টাইমআউট পরিচালনা করুন।

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

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

যখন ডিভাইসে 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 কোনও ত্রুটি ফেরত দেয়, উদাহরণস্বরূপ একটি ভুল ফোন নম্বরের জন্য অথবা যদি প্রকল্পের জন্য SMS কোটা অতিক্রম করে, তাহলে এই হ্যান্ডলারে একটি 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 আপডেট করার জন্য এটি একটি ভাল সময় হবে যাতে ব্যবহারকারী তাদের প্রত্যাশিত SMS কোডটি প্রবেশ করতে পারে। SMS কোডটি প্রবেশ করানো হয়ে গেলে, আপনি একটি নতুন PhoneAuthCredential তৈরি করতে SMS কোডের সাথে যাচাইকরণ আইডি একত্রিত করতে পারেন:

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 বার্তা পুনরায় পাঠাবে না। তবে আপনি verifyPhoneNumber পদ্ধতিটি পুনরায় forceResendingToken আর্গুমেন্টে পুনরায় পাঠান টোকেন দিয়ে পুনরায় কল করে এই আচরণটি ওভাররাইড করতে পারেন। সফল হলে, SMS বার্তাটি পুনরায় পাঠানো হবে।

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

যেসব অ্যান্ড্রয়েড ডিভাইস স্বয়ংক্রিয় 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

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

Flatter-এর জন্য Firebase Authentication 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!'),
);

পরীক্ষামূলক

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

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

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