যাচাইকরণ স্টেট পারসিস্টেন্স

Firebase JS SDK ব্যবহার করার সময় যাচাইকরণ স্টেট কীভাবে বজায় থাকে তা আপনি নির্দিষ্ট করতে পারবেন। এর মধ্যে অন্তর্ভুক্ত হল, সাইন-ইন করা ব্যবহারকারীর সেশন অনির্দিষ্টকালের জন্য চালু রাখা হবে কিনা, উইন্ডো বন্ধ করে দিলে সেশন মুছে দেওয়া হবে কিনা অথবা পৃষ্ঠা আবার লোড করলে সেশন মুছে দেওয়া হবে কিনা তা নির্দিষ্ট করার ক্ষমতা।

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

তবে, এমন কিছু ক্ষেত্র আছে যেখানে এই আচরণটি আদর্শ নাও হতে পারে:

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

উপরে উল্লেখ করা হয়েছে যে, এমন একাধিক পরিস্থিতি রয়েছে যেখানে ডিফল্ট পার্মানেন্ট পারসিস্টেন্স ওভাররাইড করার প্রয়োজন হতে পারে।

Auth স্টেট পারসিস্টেন্সের যেসব ধরন কাজ করে

আপনার অ্যাপ্লিকেশন বা ব্যবহারকারীর প্রয়োজনীয়তার উপর ভিত্তি করে নির্দিষ্ট Firebase Auth ইনস্ট্যান্সে তিন ধরনের Auth স্টেট পারসিস্ট্যান্সের মধ্যে একটি বেছে নিতে পারেন।

Enum মান বিবরণ
firebase.auth.Auth.Persistence.LOCAL 'স্থানীয়' এর থেকে বোঝা যায় যে ব্রাউজার উইন্ডো বন্ধ হয়ে গেলেও বা React Native-এ অ্যাক্টিভিটি ধ্বংস হয়ে গেলেও স্টেটটি থেকে যাবে। ওই স্ট্যাটাস মুছে ফেলার জন্য স্পষ্টভাবে সাইন-আউট করতে হবে। মনে রাখবেন, Firebase Auth ওয়েব সেশন হল সিঙ্গেল হোস্ট অরিজিন এবং এটি শুধুমাত্র একটি ডোমেনের জন্য সেভ করা হবে।
firebase.auth.Auth.Persistence.SESSION 'সেশন' এর থেকে বোঝা যায় যে, এই স্টেট শুধুমাত্র বর্তমান সেশন বা ট্যাবে থাকবে, এবং ব্যবহারকারী যে ট্যাব বা উইন্ডোতে যাচাইকরণ করেছেন সেটি বন্ধ করে দিলে এটি মুছে যাবে। শুধুমাত্র ওয়েব অ্যাপের ক্ষেত্রে প্রযোজ্য।
firebase.auth.Auth.Persistence.NONE 'কোনওটিই নয়' এর থেকে বোঝা যায় যে স্টেট শুধুমাত্র মেমরিতে স্টোর করা হবে এবং উইন্ডো বা অ্যাক্টিভিটি রিফ্রেশ করা হলে এটি মুছে যাবে।

Auth স্টেট পারসিস্টেন্স পরিবর্তন করা

আপনি firebase.auth().setPersistence মেথড কল করে আগে থেকে থাকা পারসিস্টেন্সের ধরন নির্দিষ্ট করতে বা পরিবর্তন করতে পারবেন:

Web

import { getAuth, setPersistence, signInWithEmailAndPassword, browserSessionPersistence } from "firebase/auth";

const auth = getAuth();
setPersistence(auth, browserSessionPersistence)
  .then(() => {
    // Existing and future Auth states are now persisted in the current
    // session only. Closing the window would clear any existing state even
    // if a user forgets to sign out.
    // ...
    // New sign-in will be persisted with session persistence.
    return signInWithEmailAndPassword(auth, email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
  });

Web

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION)
  .then(() => {
    // Existing and future Auth states are now persisted in the current
    // session only. Closing the window would clear any existing state even
    // if a user forgets to sign out.
    // ...
    // New sign-in will be persisted with session persistence.
    return firebase.auth().signInWithEmailAndPassword(email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
  });

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

ওয়েব ব্রাউজার ও React Native অ্যাপের ডিফল্ট হল local (যদি ব্রাউজার এই স্টোরেজ মেকানিজম সাপোর্ট করে, যেমন থার্ড-পার্টি কুকি/ডেটা চালু করা আছে) তবে Node.js ব্যাকএন্ড অ্যাপের ক্ষেত্রে এটি none।

পারসিস্টেন্স আচরণ সম্পর্কে এক ঝলকে

পারসিস্ট্যান্সের বর্তমান অবস্থা নির্ধারণ করার সময় নিম্নলিখিত মাপকাঠি প্রয়োগ করা হবে।

  • প্রাথমিকভাবে, SDK চেক করে দেখবে যে কোনও যাচাই করা ব্যবহারকারী আছেন কিনা। যতক্ষণ না setPersistence কল করা হচ্ছে, ততক্ষণ সেই ব্যবহারকারীর বর্তমান পারসিস্টেন্স টাইপ ভবিষ্যতের সাইন-ইন প্রচেষ্টার জন্য প্রযোজ্য হবে। তাই, সেই ব্যবহারকারী যদি আগের কোনও ওয়েবপেজে session-এ পারসিস্ট করে থাকেন এবং নতুন কোনও পৃষ্ঠা দেখা হয়, তাহলে অন্য ব্যবহারকারীর মাধ্যমে আবার সাইন-ইন করলে, সেই ব্যবহারকারীর স্টেটও session পারসিস্টেন্সের সাথে সেভ হয়ে যাবে।
  • কোনও ব্যবহারকারী সাইন-ইন না করে থাকলে এবং কোনও পারসিস্টেন্স নির্দিষ্ট করা না থাকলে, ডিফল্ট সেটিং প্রযোজ্য হবে (local ব্রাউজার অ্যাপে)।
  • কোনও ব্যবহারকারী সাইন-ইন না করে থাকলে এবং নতুন ধরনের পারসিস্টেন্স সেট করা থাকলে, ভবিষ্যতে সাইন-ইন করার চেষ্টায় সেই ধরনের পারসিস্টেন্স ব্যবহার করা হবে।
  • ব্যবহারকারী সাইন-ইন করে থাকলে এবং পারসিস্টেন্সের ধরন পরিবর্তন করা হলে, আগে থেকে সাইন-ইন করা ব্যবহারকারীর পারসিস্টেন্স নতুন পারসিস্টেন্সে পরিবর্তিত হবে। ভবিষ্যতে সাইন-ইন করার সব প্রচেষ্টায় সেই নতুন পারসিস্টেন্স ব্যবহার করা হবে।
  • signInWithRedirect কল করা হলে, বর্তমান পারসিস্টেন্সের ধরনটি ধরে রাখা হয় এবং OAuth ফ্লোয়ের শেষে নতুন সাইন-ইন করা ব্যবহারকারীর ক্ষেত্রে প্রয়োগ করা হয়, এমনকি পারসিস্টেন্স none হলেও এটি করা হয়। সেই পৃষ্ঠায় যদি পারসিস্টেন্স স্পষ্টভাবে উল্লেখ করা থাকে, তাহলে এটি আগের পৃষ্ঠা থেকে রিটেন অথ স্টেট পারসিস্টেন্সকে ওভাররাইড করবে যেটি রিডাইরেক্ট ফ্লো শুরু করেছে।

    Web

    import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence, GoogleAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    setPersistence(auth, inMemoryPersistence)
      .then(() => {
        const provider = new GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return signInWithRedirect(auth, provider);
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
      });

    Web

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE)
      .then(() => {
        var provider = new firebase.auth.GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return firebase.auth().signInWithRedirect(provider);
      })
      .catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
      });

ব্রাউজার ট্যাব জুড়ে প্রত্যাশিত আচরণ

বিভিন্ন ট্যাবে আলাদা আলাদা পারসিস্টেন্সের ধরন ব্যবহার করা হলে, নিম্নলিখিত প্রত্যাশিত আচরণ প্রযোজ্য হবে। প্রয়োজনীয়তা হল, যেকোনও সময়ে, একই সাথে একাধিক ধরনের সেভ করা স্টেট থাকা উচিত নয় (যেমন, session ও local ধরনের স্টোরেজে সেভ করা অথ স্টেট):

  • ব্যবহারকারীরা একাধিক ট্যাবে আলাদা আলাদা ব্যবহারকারীর সাথে session বা none পারসিস্টেন্স ব্যবহার করে সাইন-ইন করতে পারবেন । প্রতিটি ট্যাব অন্য ট্যাবের স্টেট দেখতে পায় না।
  • local পারসিস্টেন্স ব্যবহার করে সাইন-ইন করার যেকোনও প্রচেষ্টা শনাক্ত করা হবে এবং সব ট্যাবে সিঙ্ক করা হবে। ব্যবহারকারী যদি আগে session বা none পারসিস্টেন্স ব্যবহার করে নির্দিষ্ট ট্যাবে সাইন-ইন করে থাকেন, তাহলে সেই স্টেট মুছে যাবে।
  • ব্যবহারকারী যদি আগে local একাধিক ট্যাব খুলে পারসিস্টেন্স ব্যবহার করে সাইন-ইন করে থাকেন এবং তারপরে একটি ট্যাবে none বা session পারসিস্টেন্সে পরিবর্তন করেন, তাহলে সেই ট্যাবের স্ট্যাটাস session বা none-এ পারসিস্ট করা ব্যবহারকারীর সাথে পরিবর্তিত হবে এবং অন্য সব ট্যাবে ব্যবহারকারী সাইন-আউট হয়ে যাবেন।