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

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

قبل البدء

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

  2. إذا لم يسبق لك ربط تطبيقك بمشروعك على Firebase، يمكنك إجراء ذلك من وحدة تحكّم Firebase Firebase.
  3. فعِّل "البريد الإلكتروني/كلمة المرور" كمزوّد لتسجيل الدخول في مشروع Firebase الخاص بك:
    1. في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
    2. في علامة التبويب طريقة تسجيل الدخول ، فعِّل مزوّد تسجيل الدخول البريد الإلكتروني/كلمة المرور.
    3. انقر على حفظ.
  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:34.15.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:24.1.0")
    }

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

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

  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();