התמדה של מצב אימות

אתה יכול לציין כיצד מצב האימות נמשך בעת שימוש ב-Firebase JS SDK. זה כולל את היכולת לציין אם משתמש שנכנס לחשבון צריך להיות נמשך ללא הגבלת זמן עד ליציאה מפורשת, לנקות כאשר החלון נסגר או לנקות בעת טעינת דף מחדש.

עבור יישום אינטרנט, התנהגות ברירת המחדל היא להתמיד בהפעלה של משתמש גם לאחר שהמשתמש סוגר את הדפדפן. זה נוח מכיוון שהמשתמש אינו נדרש להיכנס ברציפות בכל פעם שדף האינטרנט מבקר באותו מכשיר. זה עשוי לדרוש מהמשתמש להזין מחדש את הסיסמה שלו, לשלוח אימות SMS וכו', מה שעלול להוסיף חיכוך רב לחוויית המשתמש.

עם זאת, ישנם מקרים שבהם ייתכן שהתנהגות זו אינה אידיאלית:

  • יישומים עם נתונים רגישים עשויים לרצות לנקות את המצב כאשר החלון או הכרטיסייה סגורים. זה חשוב למקרה שהמשתמש שוכח לצאת.
  • יישומים המשמשים במכשיר המשותף למספר משתמשים. דוגמה נפוצה כאן היא אפליקציה הפועלת במחשב ספרייה.
  • אפליקציה במכשיר משותף שמשתמשים מרובים יכולים לגשת אליו. המפתח אינו יכול לדעת כיצד הגישה לאפליקציה זו עשויה לרצות לספק למשתמש את היכולת לבחור אם להתמיד בהפעלה שלו או לא. ניתן לעשות זאת על ידי הוספת אפשרות "זכור אותי" במהלך הכניסה.
  • במצבים מסוימים, ייתכן שמפתח ירצה לא להתמיד במשתמש אנונימי עד שמשתמש זה ישודרג לחשבון לא אנונימי (מאוחד, סיסמה, טלפון וכו').
  • ייתכן שמפתח ירצה לאפשר למשתמשים שונים להיכנס לאפליקציה בכרטיסיות שונות. התנהגות ברירת המחדל היא להתמיד במצב על פני כרטיסיות עבור אותו מקור.

כפי שצוין לעיל, ישנם מספר מצבים שבהם ייתכן שיהיה צורך לעקוף את ברירת המחדל של ההתמדה הקבועה.

סוגים נתמכים של התמדה במדינת אישור

אתה יכול לבחור באחד משלושה סוגים של קביעת מצב אימות במופע Firebase Auth שצוין בהתבסס על האפליקציה או הדרישות של המשתמש שלך.

Enum ערך תיאור
firebase.auth.Auth.Persistence.LOCAL 'מְקוֹמִי' מציין שהמצב יימשך גם כאשר חלון הדפדפן ייסגר או שהפעילות תושמד ב-React Native. יש צורך ביציאה מפורשת כדי לנקות את המצב הזה. שים לב שהפעלות אינטרנט של Firebase Auth הן מקור מארח יחיד והן ימשיכו לדומיין בודד בלבד.
firebase.auth.Auth.Persistence.SESSION 'מוֹשָׁב' מציין שהמצב יימשך רק בהפעלה או בכרטיסייה הנוכחית, וינוקה כאשר הכרטיסייה או החלון שבהם המשתמש אומת ייסגר. חל רק על אפליקציות אינטרנט.
firebase.auth.Auth.Persistence.NONE 'אף אחד' מציין שהמצב יישמר רק בזיכרון וינוקה כאשר החלון או הפעילות יתחדשו.

שינוי התמדה של מדינת האישור

אתה יכול לציין או לשנות את סוג ההתמדה הקיים על ידי קריאה לשיטת 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;
  });

פעולה זו תשנה את סוג ההתמדה במופע האימות שצוין עבור הפעלת האימות שנשמרה כעת ותחיל סוג זה של התמדה עבור בקשות כניסה עתידיות, כולל כניסה עם בקשות להפניה מחדש. זה יחזיר הבטחה שתפתר ברגע שהמדינה תסיים להעתיק מסוג אחד של אחסון לאחר. קריאה לשיטת כניסה לאחר שינוי ההתמדה תחכה להשלמה של שינוי ההתמדה הזה לפני שתחיל אותו על מצב האימות החדש.

ברירת המחדל עבור אפליקציות דפדפן אינטרנט ו-React Native היא local (בתנאי שהדפדפן תומך במנגנון אחסון זה, למשל. קובצי Cookie/נתונים של צד שלישי מופעלים) בעוד שהיא none עבור אפליקציות עורפי של Node.js.

סקירה כללית של התנהגות התמדה

הקריטריונים הבאים יחולו בעת קביעת מצב ההתמדה הנוכחי.

  • בתחילה, ה-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 התמדה עם משתמשים שונים בכרטיסיות מרובות. כל כרטיסייה לא יכולה לראות את המצב של הכרטיסייה השנייה.
  • כל ניסיון להיכנס באמצעות התמדה local יזוהה ויסונכרן בכל הכרטיסיות. אם המשתמש היה מחובר בעבר בכרטיסייה ספציפית באמצעות session או none התמדה, מצב זה יימחק.
  • אם המשתמש היה מחובר בעבר באמצעות התמדה local עם מספר כרטיסיות פתוחות ולאחר מכן עובר none או session בכרטיסייה אחת, המצב של אותה כרטיסייה ישתנה כשהמשתמש התמיד session או none ובכל שאר הכרטיסיות, המשתמש ייצא.