يمكنك تحديد كيفية الاحتفاظ بحالة المصادقة عند استخدام حزمة تطوير البرامج (SDK) لـ Firebase JS. ويشمل ذلك إمكانية تحديد ما إذا كان يجب إبقاء بيانات المستخدم المسجّل الدخول محفوظة إلى أجل غير مسمى إلى أن يتم تسجيل الخروج صراحةً، أو محوها عند إغلاق النافذة أو محوها عند إعادة تحميل الصفحة.
بالنسبة إلى تطبيقات الويب، يكون السلوك التلقائي هو الاحتفاظ بجلسة المستخدم حتى بعد أن يغلق المستخدم المتصفّح. ويُعدّ ذلك مفيدًا لأنّه لا يُطلب من المستخدم تسجيل الدخول باستمرار في كل مرة يزور فيها صفحة الويب على الجهاز نفسه. وقد يتطلّب ذلك من المستخدم إعادة إدخال كلمة المرور وإرسال رسالة تأكيد عبر الرسائل القصيرة وما إلى ذلك، ما قد يتسبب في الكثير من المشاكل في تجربة المستخدم.
ومع ذلك، قد لا يكون هذا السلوك مثاليًا في بعض الحالات:
- قد تحتاج التطبيقات التي تحتوي على بيانات حسّاسة إلى محو الحالة عند إغلاق النافذة أو علامة التبويب. هذا مهم في حال نسي المستخدم تسجيل الخروج.
- التطبيقات التي يتم استخدامها على جهاز يشترك فيه عدة مستخدمين ومن الأمثلة الشائعة على ذلك هو تطبيق يتم تشغيله على جهاز كمبيوتر في مكتبة.
- تطبيق على جهاز مشترَك يمكن أن يصل إليه عدة مستخدمين لا يمكن للمطوّر معرفة كيفية الوصول إلى هذا التطبيق، وقد يريد منح المستخدم إمكانية اختيار الاحتفاظ بجلسته أو عدم الاحتفاظ بها. ويمكن إجراء ذلك من خلال إضافة خيار "تذكرني" أثناء تسجيل الدخول.
- في بعض الحالات، قد يريد المطوّر عدم الاحتفاظ ببيانات مستخدم مجهول إلى أن يتم ترقية هذا المستخدم إلى حساب غير مجهول (حساب موحّد أو كلمة مرور أو هاتف أو غير ذلك).
- قد يريد المطوِّر السماح لمستخدمين مختلفين بتسجيل الدخول إلى تطبيق في علامات تبويب مختلفة. السلوك التلقائي هو الاحتفاظ بالحالة في جميع علامات التبويب للمصدر نفسه.
كما ذكرنا أعلاه، هناك عدة حالات قد يكون فيها من الضروري إلغاء الإعداد التلقائي لميزة التثبيت الدائم.
الأنواع المتوافقة من الاحتفاظ بحالة المصادقة
يمكنك اختيار أحد الأنواع الثلاثة للحفاظ على حالة المصادقة في مثيل محدّد من Firebase Auth استنادًا إلى متطلبات تطبيقك أو المستخدم.
تعداد | القيمة | الوصف |
---|---|---|
firebase.auth.Auth.Persistence.LOCAL |
'local' | يشير ذلك إلى أنّه سيتم الاحتفاظ بالحالة حتى عند إغلاق نافذة المتصفّح أو إتلاف النشاط في React Native. يجب تسجيل الخروج بوضوح لإزالة هذه الحالة. يُرجى العِلم أنّ جلسات الويب في Firebase Auth هي من مصدر مضيف واحد وستتم الاحتفاظ بها لنطاق واحد فقط. |
firebase.auth.Auth.Persistence.SESSION |
'session' | يشير ذلك إلى أنّ الحالة ستظل محفوظة في الجلسة أو علامة التبويب الحالية فقط، وسيتم محو الحالة عند إغلاق علامة التبويب أو النافذة التي سجّل فيها المستخدم هويته. ينطبق هذا الإعداد على تطبيقات الويب فقط. |
firebase.auth.Auth.Persistence.NONE |
'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
(شرط أن يكون المتصفّح متوافقًا مع آلية التخزين هذه، مثل تم تفعيل ملفات تعريف الارتباط/البيانات التابعة لجهات خارجية)
بينما تكون 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
persistence و مزامنة جميع علامات التبويب. إذا كان المستخدم قد سجّل الدخول من قبل في علامة تبويب معيّنة باستخدام ميزة الاحتفاظ بالحالةsession
أوnone
، سيتم محو هذه الحالة. - إذا سجّل المستخدم الدخول سابقًا باستخدام ميزة
local
للحفاظ على السجلّ مع فتح عدة علامات تبويب، ثم تبدّل إلى ميزةnone
أوsession
للحفاظ على السجلّ في علامة تبويب واحدة، سيتم تعديل حالة علامة التبويب هذه مع الحفاظ على تسجيل دخول المستخدم فيsession
أوnone
، وسيتم تسجيل خروج المستخدم من جميع علامات التبويب الأخرى.