تسجيل الدخول في Firebase: Authentication
بناء نظام تسجيل دخول من الصفر عمل صعب وخطير: تخزين كلمات المرور بأمان، واستعادة الحسابات، والحماية من الاختراق. أخطاء صغيرة هنا قد تكشف بيانات كل المستخدمين. Firebase Authentication يقدم لك كل هذا جاهزاً ومختبراً، بأسطر قليلة. في هذا الدرس ستبني إنشاء الحساب وتسجيل الدخول والخروج، وستربط ذلك بقواعد الأمان لحماية بياناتك.
تفعيل طريقة الدخول
Section titled “تفعيل طريقة الدخول”في Firebase Console:
- اختر Authentication ثم Get started.
- من تبويب Sign-in method، فعّل Email/Password.
وهناك طرق كثيرة أخرى تفعّلها بنفس الطريقة: الدخول بحساب Google، أو رقم الهاتف، أو Apple، وغيرها.
إنشاء حساب جديد
Section titled “إنشاء حساب جديد”import { createUserWithEmailAndPassword, updateProfile } from 'firebase/auth';
const cred = await createUserWithEmailAndPassword(auth, 'sara@example.com', 'Strong#Pass2026');console.log(cred.user.email);
await updateProfile(cred.user, { displayName: 'سارة' });console.log(auth.currentUser.displayName);sara@example.comسارةcreateUserWithEmailAndPassword: ينشئ الحساب، ويسجل دخوله تلقائياً.cred.user: بيانات المستخدم الجديد، وأهمهاuid: معرّف فريد للمستخدم، ستستخدمه لربط بياناته في Firestore.updateProfile: يضيف اسماً معروضاً أو صورة للحساب.auth.currentUser: المستخدم المسجل حالياً، أوnullإن لم يوجد.
Firebase لا يخزن كلمة المرور نصاً عادياً أبداً، بل بطريقة مشفرة لا يمكن عكسها. حتى أنت كمطور لا تستطيع رؤيتها.
الأخطاء ورموزها
Section titled “الأخطاء ورموزها”العمليات قد تفشل، وكل فشل له رمز (Code) تستخدمه لعرض رسالة مناسبة:
try { await createUserWithEmailAndPassword(auth, 'sara@example.com', '123');} catch (e) { console.log(e.code);}auth/weak-password| الرمز | المعنى | رسالة مقترحة للمستخدم |
|---|---|---|
auth/weak-password |
كلمة مرور أقل من 6 حروف | «كلمة المرور ضعيفة، استخدم 6 حروف على الأقل» |
auth/email-already-in-use |
البريد مسجل مسبقاً | «هذا البريد مستخدم، جرّب تسجيل الدخول» |
auth/invalid-email |
صيغة البريد خاطئة | «اكتب بريداً صحيحاً» |
auth/invalid-credential |
بيانات الدخول خاطئة | «البريد أو كلمة المرور غير صحيحة» |
تسجيل الدخول والخروج
Section titled “تسجيل الدخول والخروج”import { signInWithEmailAndPassword, signOut } from 'firebase/auth';
await signInWithEmailAndPassword(auth, 'sara@example.com', 'Strong#Pass2026');// ... لاحقاًawait signOut(auth);متابعة حالة المستخدم: onAuthStateChanged
Section titled “متابعة حالة المستخدم: onAuthStateChanged”كيف يعرف تطبيقك أن المستخدم دخل أو خرج؟ لا تعتمد على فحص currentUser مرة واحدة، بل استمع للتغيير:
import { onAuthStateChanged } from 'firebase/auth';
onAuthStateChanged(auth, (user) => { if (user) { console.log('مسجل الدخول:', user.email); } else { console.log('زائر'); }});الدالة تُنفَّذ فوراً بالحالة الحالية، ثم كلما تغيرت. في تجربتنا: كانت سارة مسجلة، ثم خرجت، ثم دخلت من جديد، فوصلت ثلاث حالات بالترتيب: sara@example.com ثم null ثم sara@example.com.
هذا المكان المثالي لتغيير الواجهة: إظهار زر «دخول» للزائر، واسم المستخدم وزر «خروج» للمسجل. وFirebase يتذكر المستخدم تلقائياً، فإذا أغلق المتصفح وفتحه، يبقى مسجلاً دون أن يكتب كلمة المرور.
تخيّل onAuthStateChanged مثل حارس البوابة الذي يبلغك فوراً كلما دخل أحد أو خرج، بدلاً من أن تذهب أنت للسؤال كل دقيقة.
الربط بقواعد الأمان
Section titled “الربط بقواعد الأمان”هنا تكتمل الصورة. في قواعد Firestore، المتغير request.auth يحمل بيانات المستخدم الذي يرسل الطلب، أو null للزائر:
match /posts/{postId} { allow read: if true; allow create: if request.auth != null; allow update, delete: if request.auth != null && request.auth.uid == resource.data.authorId;}- القراءة: متاحة للجميع.
- الإنشاء: للمسجلين فقط.
- التعديل والحذف: لصاحب المنشور فقط، بمقارنة
uidالمستخدم بحقلauthorIdفي المنشور.
وعند إنشاء منشور، نخزن فيه معرّف صاحبه:
await addDoc(collection(db, 'posts'), { text: 'مرحباً', authorId: auth.currentUser.uid, createdAt: serverTimestamp()});جربنا القواعد فعلاً على المحاكي:
- زائر حاول إنشاء منشور ← رُفض بالخطأ
permission-denied. - سارة بعد تسجيل دخولها ← نجح الإنشاء.
- مستخدم آخر (عمر) حاول تعديل منشور سارة ← رُفض بالخطأ
permission-denied.
و serverTimestamp() تسجل وقت الخادم الحقيقي، لا وقت جهاز المستخدم الذي قد يكون مضبوطاً خطأ.
جرّب بنفسك
Section titled “جرّب بنفسك”- فعّل Email/Password في مشروعك، أو استخدم المحاكي.
- ابنِ صفحة HTML فيها نموذج بحقلي البريد وكلمة المرور، وزرين: «إنشاء حساب» و«دخول».
- اعرض رسالة عربية مناسبة لكل رمز خطأ.
- استخدم
onAuthStateChangedلإظهار «أهلاً يا …» وزر «خروج» للمسجل. - اكتب قاعدة تسمح لكل مستخدم بقراءة وكتابة مستند واحد فقط هو
users/{uid}الخاص به.
أخطاء شائعة
Section titled “أخطاء شائعة”- فحص currentUser فور تحميل الصفحة: قد يكون
nullلأن Firebase لم يتحقق بعد. استخدمonAuthStateChanged. - عرض رسائل الأخطاء الإنجليزية كما هي: حوّل الرموز لرسائل عربية مفهومة.
- الاعتماد على الواجهة للحماية: القواعد هي الحماية الوحيدة الحقيقية.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما أفضل طريقة لمعرفة هل المستخدم مسجل الدخول وتحديث الواجهة عند تغيّر ذلك؟
onAuthStateChanged تُنفَّذ بالحالة الحالية ثم مع كل دخول أو خروج، فتبقى الواجهة متزامنة دائماً.
سؤال
في قواعد الأمان، ماذا يعني الشرط request.auth.uid == resource.data.authorId؟
الشرط يقارن معرّف المستخدم الحالي بمعرّف صاحب المستند المخزن فيه، فلا يعدّل إلا صاحبه.
الخلاصة
Section titled “الخلاصة”- فعّل طرق الدخول من Console، و Firebase يخزن كلمات المرور بأمان نيابة عنك.
createUserWithEmailAndPasswordوsignInWithEmailAndPasswordوsignOutللعمليات الأساسية.- رموز الأخطاء مثل
auth/weak-passwordتُحوَّل لرسائل عربية واضحة. onAuthStateChangedيتابع حالة المستخدم، وuidمعرّفه الفريد.request.authفي قواعد الأمان يربط البيانات بأصحابها، وهي الحماية الحقيقية الوحيدة.