استمرار حالة المصادقة

يمكنك تحديد كيفية استمرار حالة المصادقة عند استخدام Firebase JS SDK. يتضمن ذلك القدرة على تحديد ما إذا كان المستخدم الذي قام بتسجيل الدخول يجب أن يستمر إلى أجل غير مسمى حتى يتم تسجيل الخروج الصريح، أو مسحه عند إغلاق النافذة، أو مسحه عند إعادة تحميل الصفحة.

بالنسبة لتطبيق ويب، السلوك الافتراضي هو الاستمرار في جلسة المستخدم حتى بعد قيام المستخدم بإغلاق المتصفح. يعد هذا أمرًا مناسبًا حيث لا يُطلب من المستخدم تسجيل الدخول بشكل مستمر في كل مرة تتم فيها زيارة صفحة الويب على نفس الجهاز. قد يتطلب ذلك من المستخدم إعادة إدخال كلمة المرور الخاصة به، وإرسال رسالة التحقق عبر الرسائل القصيرة، وما إلى ذلك، مما قد يضيف الكثير من الاحتكاك إلى تجربة المستخدم.

ومع ذلك، هناك حالات قد لا يكون فيها هذا السلوك مثاليًا:

  • قد ترغب التطبيقات التي تحتوي على بيانات حساسة في مسح الحالة عند إغلاق النافذة أو علامة التبويب. يعد هذا أمرًا مهمًا في حالة نسيان المستخدم لتسجيل الخروج.
  • التطبيقات المستخدمة على جهاز مشترك بين عدة مستخدمين. من الأمثلة الشائعة هنا تطبيق يعمل على كمبيوتر المكتبة.
  • تطبيق على جهاز مشترك يمكن الوصول إليه بواسطة عدة مستخدمين. المطور غير قادر على معرفة كيفية الوصول إلى هذا التطبيق وقد يرغب في تزويد المستخدم بالقدرة على اختيار ما إذا كان سيستمر في جلسته أم لا. ويمكن القيام بذلك عن طريق إضافة خيار "تذكرني" أثناء تسجيل الدخول.
  • في بعض المواقف، قد يرغب المطور في عدم الإبقاء على مستخدم مجهول حتى تتم ترقية هذا المستخدم إلى حساب غير مجهول (متحد، كلمة المرور، الهاتف، وما إلى ذلك).
  • قد يرغب أحد المطورين في السماح لمستخدمين مختلفين بتسجيل الدخول إلى أحد التطبيقات في علامات تبويب مختلفة. السلوك الافتراضي هو الحفاظ على الحالة عبر علامات التبويب لنفس الأصل.

كما هو مذكور أعلاه، هناك مواقف متعددة قد يلزم فيها تجاوز الثبات الدائم الافتراضي.

الأنواع المدعومة لاستمرارية حالة المصادقة

يمكنك اختيار أحد الأنواع الثلاثة لاستمرارية حالة المصادقة على مثيل Firebase Auth محدد بناءً على تطبيقك أو متطلبات المستخدم.

التعداد قيمة وصف
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 (شريطة أن يدعم المتصفح آلية التخزين هذه، على سبيل المثال: تمكين ملفات تعريف الارتباط/البيانات التابعة لجهات خارجية) في حين أنه 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 وفي جميع علامات التبويب الأخرى، سيتمكن المستخدم سيتم تسجيل الخروج.