0Pricing
Android Academy · درس

المصادقة باستخدام Firebase

تسجيل الدخول بالبريد الإلكتروني وGoogle

المصادقة باستخدام Firebase درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.

لماذا Firebase Auth؟

يتولى Firebase Authentication الأجزاء المعقدة من تسجيل دخول المستخدمين: تخزين كلمات المرور بأمان، وتحديث الرموز، واستعادة الحسابات، ودعم مزوّدين متعددين مثل البريد الإلكتروني وGoogle وApple والهاتف وتسجيل الدخول المجهول.

بدلًا من إنشاء خوادم تسجيل الدخول، تستدعون بضع واجهات API وتحصلون على FirebaseUser تم التحقق منه. في هذا الدرس ستنفّذون تسجيل الدخول باستخدام البريد الإلكتروني/كلمة المرور وGoogle.

تفعيل طرق تسجيل الدخول

قبل كتابة الشيفرة، فعّلوا المزوّدين الذين تريدون استخدامهم في وحدة تحكم Firebase:

  • انتقلوا إلى Authentication → Sign-in method.
  • فعّلوا Email/Password.
  • فعّلوا Google (واختاروا بريدًا إلكترونيًا للدعم).

لتسجيل الدخول باستخدام Google، يجب أيضًا إضافة بصمة SHA-1 الخاصة بتطبيقكم في إعدادات المشروع، وإلا فسيفشل تسجيل الدخول بسبب خطأ من المطوّر.

الحصول على نسخة FirebaseAuth

نقطة الدخول هي Firebase.auth. فهي تتيح الوصول إلى المستخدم الحالي، وتوفّر أساليب لإنشاء الحسابات وتسجيل الدخول والخروج.

تكون auth.currentUser مساوية لـ null عندما لا يكون أي مستخدم قد سجّل الدخول — وهي طريقة سريعة لتحديد الشاشة التي ينبغي عرضها عند التشغيل.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

val auth = Firebase.auth

fun isLoggedIn(): Boolean {
    return auth.currentUser != null
}

إنشاء حساب

سجّل مستخدمًا جديدًا باستخدام createUserWithEmailAndPassword. تُرجع هذه الدالة كائن Task، ولكن يمكنك في كود coroutines استخدام await() عليها (من kotlinx-coroutines-play-services).

عند النجاح، يتم تسجيل دخول المستخدم فورًا.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun register(email: String, password: String): Result<Unit> {
    return try {
        Firebase.auth
            .createUserWithEmailAndPassword(email, password)
            .await()
        Result.success(Unit)
    } catch (e: Exception) {
        Result.failure(e)
    }
}

تسجيل الدخول باستخدام البريد الإلكتروني

يتم تسجيل دخول مستخدم موجود باستخدام signInWithEmailAndPassword. وتشبه بنيته بنية التسجيل.

يتيح تغليف الاستدعاء داخل try/catch عرض أخطاء واضحة — مثل كلمة المرور الخاطئة، أو عدم وجود المستخدم، أو البريد الإلكتروني غير الصحيح.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.auth.FirebaseUser
import kotlinx.coroutines.tasks.await

suspend fun login(email: String, password: String): FirebaseUser? {
    val result = Firebase.auth
        .signInWithEmailAndPassword(email, password)
        .await()
    return result.user
}

شاشة تسجيل الدخول في Compose

اربط المصادقة بشاشة Compose صغيرة. احتفظ بالبريد الإلكتروني وكلمة المرور في state، واستدعِ الدوال المعلّقة من نطاق coroutine، واعرض الأخطاء.

@Composable
fun LoginScreen(onLoggedIn: () -> Unit) {
    var email by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    var error by remember { mutableStateOf<String?>(null) }
    val scope = rememberCoroutineScope()

    Column(Modifier.padding(16.dp)) {
        TextField(email, { email = it }, label = { Text("Email") })
        TextField(password, { password = it }, label = { Text("Password") })
        error?.let { Text(it, color = Color.Red) }
        Button(onClick = {
            scope.launch {
                val user = login(email, password)
                if (user != null) onLoggedIn() else error = "Login failed"
            }
        }) { Text("Sign in") }
    }
}

قراءة المستخدم الحالي

يحتوي FirebaseUser على تفاصيل الهوية: uid (معرّف فريد ثابت)، وemail، وdisplayName، وphotoUrl.

استخدم uid كمفتاح عند تخزين بيانات ذلك المستخدم في Firestore — إذ تضمن الخدمة أن يكون فريدًا ولا يتغير.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun describeUser() {
    val user = Firebase.auth.currentUser ?: return
    println("UID: ${user.uid}")
    println("Email: ${user.email}")
    println("Name: ${user.displayName ?: "(none)"}")
}

مراقبة حالة المصادقة

قد تتغير حالة المصادقة في أي وقت (عند تسجيل الدخول أو الخروج أو تحديث الرمز). سجّل AuthStateListener للاستجابة لهذه التغييرات بدلًا من الاستعلام المتكرر.

وهذا مناسب تمامًا للتنقل تلقائيًا بين شاشة تسجيل الدخول والشاشة الرئيسية.

import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.auth

val listener = FirebaseAuth.AuthStateListener { auth ->
    val user = auth.currentUser
    if (user == null) {
        println("Signed out -> show login")
    } else {
        println("Signed in as ${user.email}")
    }
}

// Attach and detach with lifecycle
Firebase.auth.addAuthStateListener(listener)
// Firebase.auth.removeAuthStateListener(listener)

تسجيل الدخول باستخدام Google عبر Credential Manager

الطريقة الحديثة لتسجيل الدخول باستخدام Google هي واجهة برمجة التطبيقات Credential Manager. تطلب رمز Google ID، ثم تستبدله ببيانات اعتماد Firebase.

تتمثل الخطوة الأساسية في إنشاء بيانات اعتماد GoogleAuthProvider من رمز ID المُعاد، وتمريرها إلى signInWithCredential.

import com.google.firebase.Firebase
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun firebaseSignInWithGoogle(idToken: String) {
    // idToken comes from Credential Manager / Google Identity
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    Firebase.auth.signInWithCredential(credential).await()
}

تسجيل الخروج

يتم تسجيل الخروج باستدعاء واحد: auth.signOut(). يؤدي ذلك إلى مسح المستخدم المحلي وتشغيل مستمع حالة المصادقة.

عند استخدام تسجيل الدخول عبر Google، يمكنك أيضًا مسح حالة Credential Manager حتى يظهر محدد الحسابات في المرة التالية. بعد تسجيل الخروج، تصبح قيمة currentUser هي null.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun logout() {
    Firebase.auth.signOut()
    // currentUser is now null; your AuthStateListener fires
}

معالجة أخطاء المصادقة

تؤدي إخفاقات المصادقة إلى طرح استثناءات محددة النوع يمكنك التفرع بناءً عليها:

  • FirebaseAuthInvalidUserException — المستخدم غير موجود أو معطّل.
  • FirebaseAuthInvalidCredentialsException — كلمة المرور خاطئة أو البريد الإلكتروني غير صالح.
  • FirebaseAuthUserCollisionException — البريد الإلكتروني مسجّل مسبقًا.

حوّل هذه الأخطاء إلى رسائل مفهومة للمستخدم بدلًا من عرض تتبعات المكدس الخام.

import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthUserCollisionException

fun messageFor(e: Throwable): String = when (e) {
    is FirebaseAuthInvalidCredentialsException -> "Wrong email or password"
    is FirebaseAuthUserCollisionException -> "That email is already in use"
    else -> "Something went wrong, try again"
}

تحقق سريع

تريد التبديل تلقائيًا بين شاشة تسجيل الدخول والشاشة الرئيسية كلما سجّل المستخدم الدخول أو خرج منه. ما النهج الأنسب؟

مراجعة: المصادقة

يمكنك الآن مصادقة المستخدمين باستخدام Firebase:

  • فعّل موفّري المصادقة في وحدة التحكم، وأضف SHA-1 لاستخدام Google.
  • استخدم Firebase.auth مع createUserWithEmailAndPassword / signInWithEmailAndPassword.
  • تسجيل الدخول عبر Google: احصل على رمز ID، وأنشئ بيانات اعتماد GoogleAuthProvider، ثم استدعِ signInWithCredential.
  • اقرأ بيانات الهوية عبر currentUser (واستخدم uid كمفتاح للبيانات).
  • استجب للتغييرات باستخدام AuthStateListener، وسجّل الخروج عبر signOut().

التالي: تخزين بيانات المستخدم في Cloud Firestore.

الأسئلة الشائعة

هل درس «المصادقة باستخدام Firebase» مجاني؟

نعم — نص درس «المصادقة باستخدام Firebase» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.

ماذا ستتعلم في «المصادقة باستخدام Firebase»؟

تسجيل الدخول بالبريد الإلكتروني وGoogle تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «المصادقة باستخدام Firebase»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد Firebase
  2. المصادقة باستخدام Firebase
  3. أساسيات Cloud Firestore
  4. الدفع باستخدام Cloud Messaging
← العودة إلى Android Academy