المصادقة مع Firebase باستخدام حسابات مستندة إلى كلمة المرور على Android

يمكنك استخدام Firebase Authentication للسماح للمستخدمين بالمصادقة باستخدام Firebase باستخدام عناوين بريدهم الإلكتروني وكلمات مرورهم، وإدارة حسابات تطبيقك المستندة إلى كلمة المرور.

قبل البدء

  1. أضِف Firebase إلى مشروع Android، في حال لم يسبق لك إجراء ذلك.

  2. إذا لم يسبق لك ربط تطبيقك بمشروعك على Firebase، يمكنك إجراء ذلك من وحدة تحكّم Firebase.
  3. تفعيل تسجيل الدخول باستخدام عنوان البريد الإلكتروني أو كلمة المرور:
    1. في وحدة تحكّم Firebase، افتح قسم Auth.
    2. في علامة التبويب طريقة تسجيل الدخول، فعِّل طريقة تسجيل الدخول باستخدام البريد الإلكتروني/كلمة المرور وانقر على حفظ.
  4. في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle)، أضِف الاعتمادية لمكتبة Firebase Authentication لنظام التشغيل Android. ننصحك باستخدام الرمز Firebase Android BoM للتحكّم في إصدارات المكتبة.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.7.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    باستخدام Firebase Android BoM، سيستخدم تطبيقك دائمًا إصدارات متوافقة من مكتبات Firebase لنظام التشغيل Android.

    (بديل)  إضافة تبعيات مكتبة Firebase بدون استخدام BoM

    إذا اخترت عدم استخدام Firebase BoM، يجب تحديد كل إصدار من مكتبة Firebase في سطر التبعية الخاص به.

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

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.1.0")
    }
    هل تبحث عن وحدة مكتبة خاصة بلغة Kotlin؟ اعتبارًا من تشرين الأول (أكتوبر) 2023 (Firebase BoM 32.5.0)، يمكن لمطوّري Kotlin وJava الاعتماد على وحدة المكتبة الرئيسية (للاطّلاع على التفاصيل، راجِع الأسئلة الشائعة حول هذه المبادرة).

إنشاء حساب يستند إلى كلمة مرور

لإنشاء حساب مستخدم جديد باستخدام كلمة مرور، أكمِل الخطوات التالية في نشاط تسجيل الدخول إلى تطبيقك:

  1. في طريقة onCreate لنشاط الاشتراك، احصل على مثيل المشترَك لعنصر FirebaseAuth:

    Kotlin

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. عند بدء النشاط، تحقّق ممّا إذا كان المستخدم مسجّلاً الدخول حاليًا:

    Kotlin

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. عندما يسجّل مستخدم جديد الدخول باستخدام نموذج الاشتراك في تطبيقك، أكمِل أي خطوات جديدة لفحص صحة حسابه يتطلّبها تطبيقك، مثل التحقّق من أنّه تمت كتابة كلمة مرور الحساب الجديد بشكل صحيح وتستوفي متطلبات الصعوبة.
  4. أنشئ حسابًا جديدًا من خلال إرسال عنوان البريد الإلكتروني وكلمة المرور للمستخدم الجديد إلى createUserWithEmailAndPassword:

    Kotlin

    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    في حال إنشاء الحساب الجديد، يتم أيضًا تسجيل دخول المستخدم. في دالة الاستدعاء، يمكنك استخدام طريقة getCurrentUser للحصول على بيانات حساب المستخدم.

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

تشبه خطوات تسجيل دخول مستخدم باستخدام كلمة مرور خطوات إنشاء حساب جديد. في نشاط تسجيل الدخول إلى تطبيقك، اتّبِع الخطوات التالية:

  1. في طريقة onCreate لنشاط تسجيل الدخول، احصل على مثيل المشترَك لعنصر FirebaseAuth:

    Kotlin

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. عند بدء النشاط، تحقّق ممّا إذا كان المستخدم مسجّلاً الدخول حاليًا:

    Kotlin

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. عندما يسجِّل مستخدم الدخول إلى تطبيقك، عليك إرسال عنوان البريد الإلكتروني للمستخدم وكلمة المرور إلى signInWithEmailAndPassword:

    Kotlin

    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    إذا تم تسجيل الدخول بنجاح، يمكنك استخدام FirebaseUser المعروض للمتابعة.

إجراء مقترَح: ضبط سياسة كلمة المرور

يمكنك تحسين أمان الحساب من خلال فرض متطلبات معيّنة على مدى تعقيد كلمة المرور.

لضبط سياسة كلمات المرور لمشروعك، افتح علامة التبويب سياسة كلمات المرور في صفحة "إعدادات المصادقة" في وحدة تحكّم Firebase:

إعدادات المصادقة

تتيح Firebase Authentication سياسات كلمة المرور متطلبات كلمة المرور التالية:

  • يجب إدخال حرف صغير.

  • يجب إدخال حرف كبير.

  • يجب إدخال حرف رقمي.

  • يجب إدخال حرف غير أبجدي رقمي.

    تستوفي الأحرف التالية شرط الأحرف غير الأبجدية الرقمية: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • الحد الأدنى لطول كلمة المرور (يتراوح من 6 إلى 30 حرفًا، والإعداد التلقائي هو 6)

  • الحد الأقصى لطول كلمة المرور (الحد الأقصى 4096 حرفًا)

يمكنك تفعيل فرض سياسة كلمات المرور بطريقتَين:

  • طلب: تفشل محاولات الاشتراك إلى أن يغيّر المستخدم كلمة المرور لتكون متوافقة مع سياستك.

  • الإشعار: يُسمح للمستخدمين بالاشتراك باستخدام كلمة مرور غير متوافقة. عند استخدام هذا الوضع، يجب التحقّق مما إذا كانت كلمة مرور المستخدم تمتثل للسياسة من جهة العميل وطلب تعديل كلمة المرور من العميل بطريقة ما إذا لم تكن تمتثل.

على المستخدمين الجدد دائمًا اختيار كلمة مرور تمتثل لسياسة.

إذا كان لديك مستخدمون نشطون، ننصحك بعدم تفعيل ميزة "الترقية الإجبارية عند تسجيل الدخول"، إلا إذا كنت تنوي حظر وصول المستخدمين الذين لا تتوافق كلمات مرورهم مع سياسة بدلاً من ذلك، استخدِم وضع الإشعارات الذي يسمح للمستخدمين بتسجيل الدخول باستخدام كلمات مرورهم الحالية وإعلامهم بالمتطلبات التي لا تستوفيها كلمة المرور.

إجراء مقترَح: تفعيل ميزة "الحماية من إدراج عناوين البريد الإلكتروني"

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

للحد من هذا الخطر، ننصحك بتفعيل حماية تعداد البريد الإلكتروني لمشروعك باستخدام أداة gcloud في Google Cloud. يُرجى العِلم أنّ تفعيل هذه الميزة يؤدي إلى تغيير سلوك إعداد تقارير الأخطاء في Firebase Authentication: تأكَّد من أنّ تطبيقك لا يعتمد على الأخطاء الأكثر تحديدًا.

الخطوات التالية

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

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من عنصر FirebaseUser. راجِع إدارة المستخدِمين.

  • في Firebase Realtime Database وCloud Storage قواعد الأمان، يمكنك الحصول على معرّف المستخدم الفريد للمستخدم الذي سجّل الدخول من متغيّر auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام عدة موفّري مصادقة من خلال ربط بيانات اعتماد موفّر المصادقة بحساب مستخدمحالٍ.

لتسجيل خروج مستخدم، اتصل بالرقم signOut:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();