ইমেল লিঙ্ক ব্যবহার করে ফায়ারবেসে প্রমাণীকরণ করুন

আপনি ফায়ারবেস অথেনটিকেশন ব্যবহার করে কোনো ব্যবহারকারীকে একটি লিঙ্কসহ ইমেল পাঠিয়ে সাইন ইন করাতে পারেন, যেখানে ক্লিক করে তিনি সাইন ইন করতে পারবেন। এই প্রক্রিয়ায় ব্যবহারকারীর ইমেল অ্যাড্রেসটিও যাচাই করা হয়।

ইমেইলের মাধ্যমে সাইন ইন করার অনেক সুবিধা রয়েছে:

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

শুরু করার আগে

  1. যদি আগে থেকে না করে থাকেন, তাহলে ‘শুরু করার নির্দেশিকা’-তে দেওয়া ধাপগুলো অনুসরণ করুন।

  2. আপনার Firebase প্রোজেক্টের জন্য ইমেল লিঙ্ক সাইন-ইন সক্রিয় করুন।

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

    1. Firebase কনসোলে , Auth সেকশনটি খুলুন।
    2. সাইন ইন পদ্ধতি ট্যাবে, ইমেল/পাসওয়ার্ড প্রদানকারীকে সক্রিয় করুন। মনে রাখবেন যে, ইমেল লিঙ্ক সাইন-ইন ব্যবহার করার জন্য ইমেল/পাসওয়ার্ড সাইন-ইন অবশ্যই সক্রিয় থাকতে হবে।
    3. একই বিভাগে, ইমেল লিঙ্ক (পাসওয়ার্ডবিহীন সাইন-ইন) পদ্ধতিটি সক্রিয় করুন।
    4. সংরক্ষণ করুন- এ ক্লিক করুন।

প্রমাণীকরণ প্রক্রিয়া শুরু করতে, এমন একটি ইন্টারফেস উপস্থাপন করুন যা ব্যবহারকারীকে তার ইমেল ঠিকানা প্রদান করতে অনুরোধ করবে এবং তারপরে Firebase-কে ব্যবহারকারীর ইমেলে প্রমাণীকরণ লিঙ্কটি পাঠানোর অনুরোধ জানাতে sendSignInLinkToEmail() ফাংশনটি কল করুন।

  1. ActionCodeSettings অবজেক্টটি তৈরি করুন, যা ফায়ারবেসকে ইমেল লিঙ্কটি কীভাবে তৈরি করতে হবে সে সম্পর্কে নির্দেশনা প্রদান করে। নিম্নলিখিত ফিল্ডগুলি সেট করুন:

    • url : এমবেড করার জন্য ডিপ লিঙ্ক এবং সাথে পাঠানোর জন্য যেকোনো অতিরিক্ত স্টেট। লিঙ্কটির ডোমেইনকে অবশ্যই ফায়ারবেস কনসোলের অনুমোদিত ডোমেইনের তালিকায় থাকতে হবে, যা সেটিংস ট্যাবে (অথেন্টিকেশন -> সেটিংস -> অনুমোদিত ডোমেইন) গিয়ে পাওয়া যাবে। যদি অ্যাপটি ব্যবহারকারীর ডিভাইসে ইনস্টল করা না থাকে বা ইনস্টল করা সম্ভব না হয়, তাহলে লিঙ্কটি তাকে এই URL-এ রিডাইরেক্ট করবে।

    • androidPackageName এবং IOSBundleId : অ্যান্ড্রয়েড বা আইওএস ডিভাইসে সাইন-ইন লিঙ্কটি খোলার সময় যে অ্যাপগুলি ব্যবহার করা হবে। মোবাইল অ্যাপের মাধ্যমে ইমেল অ্যাকশন লিঙ্ক খোলার জন্য কীভাবে ফায়ারবেস ডাইনামিক লিঙ্ক কনফিগার করতে হয় সে সম্পর্কে আরও জানুন।

    • handleCodeInApp : এটিকে true তে সেট করুন। অন্যান্য আউট-অফ-ব্যান্ড ইমেল অ্যাকশনের (যেমন পাসওয়ার্ড রিসেট এবং ইমেল ভেরিফিকেশন) মতো নয়, সাইন-ইন অপারেশনটি সবসময় অ্যাপের মধ্যেই সম্পন্ন করতে হবে। এর কারণ হলো, ফ্লো-এর শেষে ব্যবহারকারীকে সাইন-ইন করা অবস্থায় এবং তার অথেন্টিকেশন স্টেট অ্যাপের মধ্যেই সংরক্ষিত থাকার কথা।

    • dynamicLinkDomain : (Deprecated, use linkDomain ) When multiple custom dynamic link domains are defined for a project, specify which one to use when the link is to be opened using a specified mobile app (for example, example.page.link ). Otherwise the first domain is automatically selected.

    • linkDomain : নির্দিষ্ট মোবাইল অ্যাপ ব্যবহার করে লিঙ্কটি খোলার জন্য ব্যবহৃত ঐচ্ছিক কাস্টম ফায়ারবেস হোস্টিং ডোমেইন। ডোমেইনটি অবশ্যই ফায়ারবেস হোস্টিং-এ কনফিগার করা এবং প্রজেক্টের মালিকানাধীন হতে হবে। এটি কোনো ডিফল্ট হোস্টিং ডোমেইন ( web.app বা firebaseapp.com ) হতে পারবে না। এটি বাতিল হয়ে যাওয়া dynamicLinkDomain সেটিং-এর পরিবর্তে ব্যবহৃত হবে।

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. ব্যবহারকারীর ইমেইল ঠিকানা জিজ্ঞাসা করুন।

  3. ব্যবহারকারীর ইমেইলে প্রমাণীকরণ লিঙ্কটি পাঠান এবং তার ইমেইলটি সংরক্ষণ করুন, যাতে ব্যবহারকারী একই ডিভাইসে ইমেইল সাইন-ইন সম্পন্ন করলে তা কাজে লাগে।

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

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

অনাকাঙ্ক্ষিত ব্যবহারকারী বা অনাকাঙ্ক্ষিত ডিভাইসে সাইন-ইন করার জন্য সাইন-ইন লিঙ্কটি যাতে ব্যবহার করা না যায়, সেজন্য সাইন-ইন প্রক্রিয়া সম্পন্ন করার সময় Firebase Auth-এর জন্য ব্যবহারকারীর ইমেল ঠিকানা প্রদান করা আবশ্যক। সাইন-ইন সফল হওয়ার জন্য, এই ইমেল ঠিকানাটি অবশ্যই সেই ঠিকানার সাথে মিলতে হবে যেখানে সাইন-ইন লিঙ্কটি মূলত পাঠানো হয়েছিল।

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

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

এছাড়াও, মধ্যবর্তী সার্ভার দ্বারা আপনার লিঙ্কটি সম্ভাব্যভাবে হস্তগত হওয়া এড়াতে প্রোডাকশনে একটি HTTPS URL ব্যবহার করা নিশ্চিত করুন।

সম্পূর্ণ সাইন-ইন

ফায়ারবেস ডাইনামিক লিঙ্কস এখন আর ব্যবহার করা হয় না; সাইন-ইন লিঙ্ক পাঠানোর জন্য এখন ফায়ারবেস হোস্টিং ব্যবহার করা হয়। প্ল্যাটফর্ম-নির্দিষ্ট কনফিগারেশনের জন্য নির্দেশিকাগুলো অনুসরণ করুন:

মোবাইল অ্যাপ্লিকেশনের মাধ্যমে সাইন-ইন সম্পন্ন করার জন্য, অ্যাপ্লিকেশনটিকে আগত অ্যাপ্লিকেশন লিঙ্কটি শনাক্ত করতে, অন্তর্নিহিত ডিপ লিঙ্কটি পার্স করতে এবং তারপরে সাইন-ইনটি সম্পূর্ণ করতে কনফিগার করতে হবে।

  1. আপনার লিঙ্ক হ্যান্ডলারে, লিঙ্কটি ইমেল লিঙ্ক অথেনটিকেশনের জন্য কিনা তা যাচাই করুন এবং যদি তাই হয়, তাহলে সাইন-ইন প্রক্রিয়াটি সম্পন্ন করুন।

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

আপনি এই প্রমাণীকরণ পদ্ধতিটি কোনো বিদ্যমান ব্যবহারকারীর সাথেও লিঙ্ক করতে পারেন। উদাহরণস্বরূপ, যে ব্যবহারকারী পূর্বে অন্য কোনো প্রদানকারী, যেমন একটি ফোন নম্বর, ব্যবহার করে প্রমাণীকৃত হয়েছেন, তিনি তার বিদ্যমান অ্যাকাউন্টে এই সাইন-ইন পদ্ধতিটি যোগ করতে পারেন।

পার্থক্যটা হবে অপারেশনটির দ্বিতীয়ার্ধে:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

কোনো সংবেদনশীল কার্যক্রম চালানোর আগে ইমেল লিঙ্কের ব্যবহারকারীকে পুনরায় প্রমাণীকরণের জন্যও এটি ব্যবহার করা যেতে পারে।

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

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

যদি আপনি আপনার প্রজেক্টটি ১৫ই সেপ্টেম্বর, ২০২৩ বা তার পরে তৈরি করে থাকেন, তাহলে ইমেইল এনুমারেশন প্রোটেকশন ডিফল্টরূপে সক্রিয় থাকে। এই ফিচারটি আপনার প্রজেক্টের ইউজার অ্যাকাউন্টগুলোর নিরাপত্তা উন্নত করে, কিন্তু এটি fetchSignInMethodsForEmail() মেথডটিকে নিষ্ক্রিয় করে দেয়, যা আমরা পূর্বে আইডেন্টিফায়ার-ফার্স্ট ফ্লো বাস্তবায়নের জন্য সুপারিশ করেছিলাম।

যদিও আপনি আপনার প্রোজেক্টের জন্য ইমেল গণনা সুরক্ষা নিষ্ক্রিয় করতে পারেন, আমরা তা না করার পরামর্শ দিই।

আরও বিস্তারিত তথ্যের জন্য ইমেল গণনা সুরক্ষা সংক্রান্ত ডকুমেন্টেশন দেখুন।

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

কোনো ব্যবহারকারী একটি নতুন অ্যাকাউন্ট তৈরি করার পর, এই অ্যাকাউন্টটি আপনার Firebase প্রজেক্টের অংশ হিসেবে সংরক্ষিত হয় এবং ব্যবহারকারী কোন সাইন-ইন পদ্ধতি ব্যবহার করেছেন তা নির্বিশেষে, আপনার প্রজেক্টের প্রতিটি অ্যাপে তাকে শনাক্ত করতে এটি ব্যবহার করা যেতে পারে।

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

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

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

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

await FirebaseAuth.instance.signOut();