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

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

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

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

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

كما ذكرنا أعلاه، هناك العديد من الحالات التي يكون فيها الإعداد التلقائي قد يلزم إلغاء الاستمرارية.

الأنواع المتوافقة من بقاء حالة المصادقة

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

Enum القيمة الوصف
firebase.auth.Auth.Persistence.LOCAL "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;
  });

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

الإعداد التلقائي لمتصفِّح الويب وتطبيقات React المحلية هو local (بشرط أن يستخدم المتصفح آلية التخزين هذه، على سبيل المثال ملفات تعريف الارتباط/البيانات التابعة لجهات خارجية مفعّلة) بينما هذا هو none لتطبيقات Node.js الخلفية.

نظرة عامة على سلوك المثابرة

سيتم تطبيق المعايير التالية عند تحديد حالة والمثابرة.

  • في البداية، ستتحقّق حزمة تطوير البرامج (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 وفي جميع علامات التبويب الأخرى، سيتم تسجيل خروج المستخدم.