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

আপনি Firebase প্রমাণীকরণ ব্যবহার করে একটি ব্যবহারকারীকে একটি লিঙ্ক সহ একটি ইমেল পাঠিয়ে সাইন ইন করতে পারেন, যেটিতে ক্লিক করে তারা সাইন ইন করতে পারে৷ প্রক্রিয়ায়, ব্যবহারকারীর ইমেল ঠিকানাও যাচাই করা হয়৷

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

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

আপনি শুরু করার আগে

ফায়ারবেস নির্ভরতা ইনস্টল এবং পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

  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 কনসোলে , Auth বিভাগটি খুলুন।
  2. সাইন ইন পদ্ধতি ট্যাবে, ইমেল/পাসওয়ার্ড প্রদানকারী সক্ষম করুন। নোট করুন যে ইমেল লিঙ্ক সাইন-ইন ব্যবহার করার জন্য ইমেল/পাসওয়ার্ড সাইন-ইন অবশ্যই সক্রিয় থাকতে হবে।
  3. একই বিভাগে, ইমেল লিঙ্ক (পাসওয়ার্ডবিহীন সাইন-ইন) সাইন-ইন পদ্ধতি সক্ষম করুন।
  4. Save এ ক্লিক করুন।

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

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

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

    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")
        // ...
    }
    [[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. অ্যাপল অ্যাপ্লিকেশন কনফিগার করা:

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

    আরও তথ্যের জন্য Apple এর ডকুমেন্টেশন সাইটে সম্পর্কিত ডোমেনগুলিকে সমর্থন করা দেখুন৷

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

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}
if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

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

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

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

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

  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.
  }
  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.
  }];

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

  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.
  }
  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.
  }];

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

Firebase Authentication iOS SDK v11.8.0-এর আগে, সঠিক অ্যাপে সাইন-ইন লিঙ্কগুলি খোলার জন্য ইমেল লিঙ্ক সাইন ইন বৈশিষ্ট্য Firebase Dynamic Links উপর নির্ভর করত। এই যাচাইকরণ লিঙ্কগুলিকে অবমূল্যায়ন করা হয়েছে, কারণ Firebase Dynamic Links 25 আগস্ট, 2025-এ বন্ধ হয়ে যাবে৷

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

আপনি যদি আপনার প্রকল্পটি 15 সেপ্টেম্বর, 2023-এ বা তার পরে তৈরি করেন, তাহলে ইমেল গণনা সুরক্ষা ডিফল্টরূপে সক্ষম করা হয়। এই বৈশিষ্ট্যটি আপনার প্রকল্পের ব্যবহারকারীর অ্যাকাউন্টগুলির নিরাপত্তা উন্নত করে, কিন্তু এটি fetchSignInMethodsForEmail() পদ্ধতিটি নিষ্ক্রিয় করে, যা আমরা পূর্বে শনাক্তকারী-প্রথম প্রবাহ বাস্তবায়নের জন্য সুপারিশ করেছিলাম।

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

আরও জানতে, ইমেল গণনা সুরক্ষা সক্ষম বা অক্ষম করুন দেখুন।

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

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

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

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

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

একজন ব্যবহারকারীকে সাইন আউট করতে, signOut:

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

আপনি প্রমাণীকরণ ত্রুটির সম্পূর্ণ পরিসরের জন্য ত্রুটি হ্যান্ডলিং কোড যোগ করতে চাইতে পারেন। হ্যান্ডেল ত্রুটি দেখুন.