تداوم وضعیت احراز هویت

می‌توانید مشخص کنید که چگونه هنگام استفاده از Firebase JS SDK وضعیت Authentication باقی می‌ماند. این شامل توانایی تعیین اینکه آیا کاربر وارد شده باید به طور نامحدود باقی بماند تا زمانی که صریح از سیستم خارج شود، پس از بسته شدن پنجره پاک شود یا در بارگذاری مجدد صفحه پاک شود.

برای یک برنامه وب، رفتار پیش‌فرض این است که جلسه کاربر حتی پس از بستن مرورگر توسط کاربر ادامه یابد. این راحت است زیرا کاربر لازم نیست به طور مداوم هر بار که از صفحه وب در همان دستگاه بازدید می شود وارد سیستم شود. این ممکن است مستلزم آن باشد که کاربر مجبور باشد رمز عبور خود را مجدداً وارد کند، یک تأیید پیامکی ارسال کند، و غیره، که می تواند اصطکاک زیادی را به تجربه کاربر اضافه کند.

با این حال، مواردی وجود دارد که این رفتار ممکن است ایده آل نباشد:

  • برنامه‌های دارای داده‌های حساس ممکن است بخواهند وقتی پنجره یا برگه بسته است وضعیت را پاک کنند. این در صورتی مهم است که کاربر فراموش کند از سیستم خارج شود.
  • برنامه‌هایی که در دستگاهی به اشتراک گذاشته شده توسط چندین کاربر استفاده می‌شوند. یک مثال رایج در اینجا برنامه ای است که در رایانه کتابخانه اجرا می شود.
  • برنامه ای در یک دستگاه مشترک که ممکن است چندین کاربر به آن دسترسی داشته باشند. توسعه‌دهنده نمی‌تواند نحوه دسترسی به آن برنامه را بگوید و ممکن است بخواهد به کاربر این امکان را بدهد که انتخاب کند جلسه خود را ادامه دهد یا نه. این را می توان با افزودن گزینه "Remember Me" در حین ورود به سیستم انجام داد.
  • در برخی شرایط، یک توسعه‌دهنده ممکن است بخواهد کاربر ناشناس را تا زمانی که آن کاربر به یک حساب غیر ناشناس ارتقا ندهد (فدرال، رمز عبور، تلفن و غیره) ادامه ندهد.
  • یک توسعه دهنده ممکن است بخواهد به کاربران مختلف اجازه دهد تا به یک برنامه در برگه های مختلف وارد شوند. رفتار پیش‌فرض این است که وضعیت در سربرگ‌ها برای همان مبدأ حفظ شود.

همانطور که در بالا ذکر شد، موقعیت‌های متعددی وجود دارد که ممکن است نیاز به لغو ماندگاری دائمی پیش‌فرض باشد.

انواع پشتیبانی شده از ماندگاری حالت Auth

می‌توانید یکی از سه نوع ماندگاری وضعیت Auth را در یک نمونه Firebase 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 modular API

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 namespaced API

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 modular API

    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 namespaced API

    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 persistence با کاربران مختلف در چندین برگه وارد سیستم شوند. هر تب نمی تواند وضعیت برگه دیگر را ببیند.
  • هرگونه تلاش برای ورود به سیستم با استفاده از ماندگاری local در همه برگه‌ها شناسایی و همگام‌سازی می‌شود. اگر کاربر قبلاً در یک برگه خاص با استفاده از session یا none persistence وارد شده باشد، آن حالت پاک خواهد شد.
  • اگر کاربر قبلاً با استفاده از ماندگاری local با چندین برگه باز وارد سیستم شده است و سپس به none یا ماندگاری session در یک برگه تغییر می‌کند، وضعیت آن برگه با ماندگاری کاربر در session یا none و در همه برگه‌های دیگر، کاربر تغییر می‌کند. از سیستم خارج خواهد شد.