ماندگاری وضعیت اصالت‌سنجی

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

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

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

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

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

انواع پشتیبانی‌شده ماندگاری وضعیت «احراز هویت»

می‌توانید یکی از سه نوع ماندگاری وضعیت «احراز هویت» را در نمونه مشخصی از «احراز هویت Firebase» براساس الزامات برنامه یا کاربرتان انتخاب کنید.

شمارشی مقدار شرح
firebase.auth.Auth.Persistence.LOCAL «محلی» نشان می‌دهد که وضعیت حتی وقتی پنجره مرورگر بسته می‌شود یا فعالیت در React Native ازبین می‌رود، حفظ خواهد شد. برای پاک کردن این وضعیت، باید به‌طور صریح از سیستم خارج شوید. توجه داشته باشید که جلسات وب «احراز هویت Firebase» دارای مبدأ میزبان واحد هستند و فقط برای یک دامنه حفظ می‌شوند.
firebase.auth.Auth.Persistence.SESSION «جلسه» نشان می‌دهد که وضعیت فقط در جلسه یا برگه کنونی ماندگار خواهد بود، و وقتی برگه یا پنجره‌ای که کاربر در آن اصالت‌سنجی کرده است بسته شود، وضعیت پاک خواهد شد. فقط برای برنامه‌های وب اعمال می‌شود.
firebase.auth.Auth.Persistence.NONE «هیچ‌کدام» نشان می‌دهد که وضعیت فقط در حافظه ذخیره می‌شود و وقتی پنجره یا فعالیت بازآوری می‌شود پاک خواهد شد.

درحال تغییر دادن پایداری وضعیت «احراز هویت»

با فراخوانی روش 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 ذخیره‌شده کنونی تغییر می‌دهد و این نوع ماندگاری را برای درخواست‌های ورود به سیستم آینده، ازجمله درخواست‌های ورود به سیستم با هدایت مجدد، اعمال می‌کند. این کار وعده‌ای برمی‌گرداند که وقتی وضعیت از یک نوع فضای ذخیره‌سازی به نوع دیگر کپی شد محقق می‌شود. فراخوانی روش ورود به سیستم پس‌از تغییر پایداری منتظر می‌ماند تا تغییر پایداری تکمیل شود و سپس آن را روی وضعیت جدید «اصالت‌سنجی» اعمال می‌کند.

مقدار پیش‌فرض برای مرورگر وب و برنامه‌های React Native،‏ local است (به‌شرطی که مرورگر از این سازوکار ذخیره‌سازی پشتیبانی کند، برای نمونه کوکی‌ها/داده‌های طرف سوم فعال است) درحالی‌که برای برنامه‌های زیرینه Node.js، none است.

نمای کلی رفتار ماندگاری

معیارهای زیر هنگام تعیین وضعیت فعلی پایداری اعمال خواهد شد.

  • در ابتدا، «کیت توسعه نرم‌افزار» بررسی می‌کند که آیا کاربر اصیل وجود دارد یا نه. مگر اینکه 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 اصلاح خواهد شد و کاربر در همه برگه‌های دیگر از سیستم خارج خواهد شد.