Apple প্ল্যাটফর্মে ইমেল লিঙ্ক ব্যবহার করে Firebase-এর মাধ্যমে যাচাইকরণ

আপনি Firebase Authentication ব্যবহার করে কোনও ব্যবহারকারীকে একটি লিঙ্ক সহ ইমেল পাঠিয়ে সাইন-ইন করতে দিতে পারেন যেটিতে ক্লিক করে তিনি সাইন-ইন করতে পারবেন। এই প্রসেসে, ব্যবহারকারীর ইমেল আইডিও যাচাই করা হয়।

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

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

শুরু করার আগে

Firebase ডিপেন্ডেন্সি ইনস্টল ও ম্যানেজ করতে Swift Package Manager ব্যবহার করুন।

  1. Xcode-এ, আপনার অ্যাপ প্রোজেক্ট খোলা থাকা অবস্থায়, ফাইল > প্যাকেজ যোগ করুন বিকল্পে নেভিগেট করুন।
  2. প্রম্পট করা হলে, Firebase Apple প্ল্যাটফর্ম SDK রিপোজিটরি যোগ করুন:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Firebase Authentication লাইব্রেরি বেছে নিন।
  5. আপনার টার্গেটের বিল্ড সেটিংসের অন্যান্য লিঙ্কার ফ্ল্যাগ বিভাগে -ObjC ফ্ল্যাগ যোগ করুন।
  6. এটি সম্পূর্ণ হয়ে গেলে, Xcode অটোমেটিক আপনার ডিপেন্ডেন্সি ব্যাকগ্রাউন্ডে সমাধান ও ডাউনলোড করা শুরু করবে।

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

  1. Firebase কনসোলে, নিরাপত্তা > যাচাইকরণ বিকল্পে যান।

  2. সাইন-ইন পদ্ধতি ট্যাবে, ইমেল/পাসওয়ার্ড সাইন-ইন প্রোভাইডার চালু করুন। মনে রাখবেন, ইমেল লিঙ্ক সাইন-ইন ব্যবহার করতে হলে ইমেল/পাসওয়ার্ড সাইন-ইন চালু করতে হবে।

  3. একই বিভাগে, ইমেল লিঙ্ক (পাসওয়ার্ড ছাড়াই সাইন-ইন) পরিষেবা প্রদানকারীকে চালু করুন।

  4. সেভ করুন বিকল্পে ক্লিক করুন।

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

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

    • url: এম্বেড করার জন্য ডিপ লিঙ্ক এবং অতিরিক্ত কোনও স্টেট পাস করতে হবে কিনা। আপনি আগে থেকে না করে থাকলে, অনুমোদিত ডোমেনের তালিকায় আপনার ডোমেন যোগ করুন:

      1. Firebase কনসোলে, নিরাপত্তা > অনুমোদন > সেটিংস ট্যাব বিকল্পে যান।

      2. অনুমোদিত ডোমেন বিভাগে, ডোমেন যোগ করুন বিকল্পে ক্লিক করুন এবং আপনার ডোমেন যোগ করুন।

    • iOSBundleID ও androidPackageName: Firebase Authentication-কে নির্ধারণ করতে সাহায্য করে যে এটি শুধুমাত্র ওয়েব বা মোবাইল লিঙ্ক তৈরি করবে কিনা যা Android বা Apple ডিভাইসে খোলা হয়।
    • handleCodeInApp: 'সত্য' হিসেবে সেট করা আছে। অন্যান্য আউট-অফ-ব্যান্ড ইমেল অ্যাকশনের (পাসওয়ার্ড রিসেট ও ইমেল যাচাইকরণ) মতো সাইন-ইন অপারেশন অ্যাপেই সম্পূর্ণ করতে হবে। এর কারণ হল, ফ্লোয়ের শেষে, ব্যবহারকারীকে সাইন-ইন করতে হবে এবং অ্যাপের মধ্যে তার Auth স্টেট সেভ করা থাকবে।
    • linkDomain: কোনও প্রোজেক্টের জন্য কাস্টম Hosting লিঙ্ক ডোমেন নির্দিষ্ট করা থাকলে, কোনও নির্দিষ্ট মোবাইল অ্যাপের মাধ্যমে লিঙ্কটি খোলার সময় কোনটি ব্যবহার করতে হবে তা উল্লেখ করুন। অন্যথায়, ডিফল্ট ডোমেন অটোমেটিক বেছে নেওয়া হবে (যেমন, PROJECT_ID.firebaseapp.com)।
    • dynamicLinkDomain: শীঘ্রই বন্ধ হয়ে যাবে। এই প্যারামিটার নির্দিষ্ট করবেন না।

    Swift

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Objective-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    ActionCodeSettings সম্পর্কে আরও জানতে, ইমেল অ্যাকশনে স্টেট পাস করা বিভাগটি দেখুন।

  2. ব্যবহারকারীর ইমেল আইডি লিখুন।

  3. ব্যবহারকারীর ইমেলে যাচাইকরণ লিঙ্ক পাঠান এবং ব্যবহারকারী একই ডিভাইসে ইমেল সাইন-ইন সম্পূর্ণ করলে ব্যবহারকারীর ইমেল আইডি সেভ করুন।

    Swift

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Objective-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

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

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

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

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

Apple মোবাইল অ্যাপে সাইন-ইন করা

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

কনফিগার করুন Firebase Hosting

মোবাইল অ্যাপ্লিকেশনে খোলার জন্য তৈরি করা ও পাঠানো লিঙ্কের ক্ষেত্রে Firebase Authentication Firebase Hosting ডোমেন ব্যবহার করে। আপনার জন্য আগে থেকেই একটি ডিফল্ট Firebase Hosting ডোমেন কনফিগার করা হয়েছে।

  1. Firebase Hosting ডোমেন কনফিগার করুন:

    Firebase কনসোলে, হোস্টিং ও সার্ভারলেস > হোস্টিং বিকল্পে যান।

    • মোবাইল অ্যাপ্লিকেশনে খোলার ইমেল লিঙ্কের জন্য ডিফল্ট ডোমেন ব্যবহার করতে চাইলে, আপনার ডিফল্ট সাইটে যান এবং আপনার ডিফল্ট Hosting ডোমেনটি দেখে নিন। ডিফল্ট Hosting ডোমেন সাধারণত এই ধরনের হয়: PROJECT_ID.firebaseapp.com.

      ইনকামিং লিঙ্ক ইন্টারসেপ্ট করার জন্য আপনার অ্যাপ কনফিগার করার সময় এই ভ্যালু প্রয়োজন হবে।

    • ইমেল লিঙ্কের জন্য কাস্টম ডোমেন ব্যবহার করতে চাইলে, আপনি Firebase Hosting-এর সাথে একটি রেজিস্টার করতে পারেন এবং লিঙ্কের ডোমেনের জন্য সেটি ব্যবহার করতে পারেন।

  2. Apple অ্যাপ্লিকেশন কনফিগার করা:

    অ্যাপ লিঙ্কের জন্য বেছে নেওয়া ডোমেনকে অ্যাসোসিয়েটেড ডোমেন হিসেবে কনফিগার করতে হবে। আপনার অ্যাপে এনটাইটেলমেন্ট সেট-আপ করতে, Xcode-এ টার্গেটের সাইন-ইন ও ক্ষমতা ট্যাব খুলুন এবং আগের ধাপ থেকে Firebase Hosting ডোমেন অ্যাসোসিয়েটেড ডোমেন ক্ষমতার মধ্যে যোগ করুন। ডিফল্ট Firebase Hosting ডোমেন ব্যবহার করলে, এটি applinks:PROJECT_ID.firebaseapp.com হবে।

    আরও তথ্যের জন্য Apple-এর ডকুমেন্টেশন সাইটে অ্যাসোসিয়েট ডোমেন কাজ করে লিঙ্ক দেখুন।

উপরে বর্ণিত লিঙ্কটি পাওয়ার পরে, এটি ইমেল লিঙ্ক যাচাইকরণের জন্য কিনা তা যাচাই করুন এবং সাইন-ইন প্রসেস সম্পূর্ণ করুন।

Swift

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Objective-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Android অ্যাপ্লিকেশনে ইমেল লিঙ্কের মাধ্যমে সাইন-ইন কীভাবে ম্যানেজ করতে হয় তা জানতে, Android নির্দেশিকা দেখুন।

ওয়েব অ্যাপ্লিকেশনে ইমেল লিঙ্কের মাধ্যমে সাইন-ইন কীভাবে ম্যানেজ করতে হয় সেই সম্পর্কে জানতে, ওয়েব গাইড দেখুন।

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

অপারেশনের দ্বিতীয় অংশে পার্থক্য দেখা যাবে:

Swift

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

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

Swift

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

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

Firebase Authentication iOS SDK v11.8.0-এর আগে, ইমেল লিঙ্ক ব্যবহার করে সাইন-ইন করার ফিচার সঠিক অ্যাপে সাইন-ইন লিঙ্ক খোলার জন্য Firebase Dynamic Links-এর উপর নির্ভর করত। এইসব যাচাইকরণ লিঙ্ক আর ব্যবহার করা যাবে না, কারণ Firebase Dynamic Links ২৫ আগস্ট, ২০২৫-এ বন্ধ হয়ে যাবে।

আপনার অ্যাপে পুরনো স্টাইলের লিঙ্ক ব্যবহার করা হলে, আপনাকে নতুন Firebase Hosting ভিত্তিক সিস্টেমে অ্যাপ মাইগ্রেট করতে হবে।

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

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

আরও জানতে, ইমেল এনুমেরেশন সুরক্ষা চালু বা বন্ধ করা দেখুন।

পরবর্তী ধাপ

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

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

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

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

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

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

এছাড়াও, আপনি হয়ত সম্পূর্ণ রেঞ্জের যাচাইকরণ সমস্যার জন্য সমস্যা সমাধানকারী কোড যোগ করতে চান। সমস্যা সমাধান করা দেখুন।