برمجة الأندرويد

درس Firebase Authentication

فى الكثير من التطبيقات تحتاج لعمل نظام تسجيل وتسجيل دخول للمستخدمين حيث تقوم باعداد الواجهة من خلال الاندرويد واعداد الـ backend او الويب سيرفس الخاصة بتسجيل الدخول والتسجيل باستخدام php او .Net او غيرها حيث تقوم بكتابة الكثير من الاكواد من طرف الاندرويد ومن طرف السيرفر لتنفيذ نظام تسجيل دخول فعال لذلك اتت خدمة Firebase Authentication كـحل سريع جدا ومريح لتنفيذ نظام تسجيل وتسجيل دخول فى تطبيق وذلك بأقل قدر من الاكواد ودون الحاجه للـ backend او ملفات توضع على السيرفر وتوفر عليك الكثير من الوقت والمجهود .

 

وتعتبر خدمة Firebase Authentication خدمة مجانية وغير محدودة الاستخدام كبعض خدمات  firebase الاخرى وسنقوم اليوم بجولة مع Firebase Authentication وسنتطرق الى اغلب مميزاتها لتبدأ استخدامها مع تطبيقاتك .

 

– إضافة firebase الى المشروع .

فى البداية يجب علينا عمل تطبيق فى ال firebase console او استخدام تطبيق سابق وتحميل ملف google-services.json وإضافته للمشروع مع تهيئة ملفات الـ gradle  وقد فعلنا ذلك من قبل فى تدوينة FCM بالعربية  Firebase Cloud Messaging الجزء الأول يمكنك الرجوع اليها ومعرفة كيفية اضافة firebase للمشروع وتهيئة ملفات الـ gradle .

– تفعيل الـSign-in باستخدام الـ Email والـ Password

توفر لك خدمة Firebase Authentication عمل أنظمة تسجيل دخول متعددة الانماط  مثل نظام التسجيل وتسجيل الدخول العادى بالايميل والباسورد أو تسجيل الدخول باستخدام جوجل وفيس بوك وتويتر او حتى التسجيل كمستخدم مجهول فى الخلفية وحفظ بياناته حتى اذا ما قام المستخدم بالتسجيل لاحقا يجد ان بياناته واعدادات التطبيق الخاصة به كما هى محفوظة لكن فى هذه التدوينة سنتطرق الى نظام التسجيل وتسجيل الدخول باستخدام الـ Email والباسورد وهو الاكثر شيوعا .

 

– إضافة مكتبة firebaseauth  فى ملف الـ gradle

وهو المكتبة الخاصة بـ Firebase Authentication

    compile 'com.google.firebase:firebase-auth:9.0.2'

 

– إنشاء LoginActivity و RegisterActivity

سنقوم بإنشاء أكتيفيتى جديد للـ Login وكذلك أكتيتفى جديد للـ Register  مع وضع text لاستعادة الباسورد كما هو الحال فى أغلب انظمة تسجيل الدخول فى التطبيقات او مواقع الإنترنت

 

مجرد كود عادى xml وتعريف المكونات فى الجافا

 

– تسجيل مستخدم جديد

فى صفحة تسجيل مستخدم جديد وعند الضغط على زر Register نقوم بكتابة كود تسجيل مستخدم جديد كالاتى :

 

شىء رائع صحيح ؟ ! بسطر واحد فقط يتم ارسال الايميل والباسورد للـ firebase وتسجيل مستخدم جديد يمكنك استخدام السطر السابق فى اى مكان فى التطبيق وفى اى صفحة تسجيل ويتم تسجيل المستخدم لكن لحظة ! أنت كمبرمج يمكنك معرفة اذا ما تم التسجيل بشكل صحيح ام لا عن طريق الذهاب لل firebase console واختيار auth وستجد انه تم تسجيل المستخدم ام لا

 

لكن برمجيا نريد أن نعلم المستخدم نفسه من خلال التطبيق وقت التسجيل هل تم التسجيل بنجاح ام لا هل حدثت مشكلة ام لا بالتأكيد المستخدم يريد ان يعرف النتيجة ولذلك يجب ان نقوم بإضافة Listener يقوم بالاستماع لنتيجة التسجيل حيث يمكننا من خلاله التأكد بانه تم التسجيل بنجاح وبالتالى نظهر للمستخدم رسالة أن التسجيل تم او نقوم بالانتقال به الى صفحة اخرى داخل التطبيق أو أى أمر اخر ويتم اضافة Listener كالتالى :

          FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        
                    }
                });

 

الان عند اكتمال العملية سواء تمت بنجاح او فشلت سيتم استدعاء الميثود onComplete السابقة ويتم تمرير task اليها وهى تاسك التسجيل ويمكننا ببساطة التحقق من أن التسجيل تم بنجاح ام لا عن طريق الميثود  isSuccessful كالتالى :

 FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                         if (task.isSuccessful()){
                            Toast.makeText(RegisterActivity.this, "تم تسجيلك بنجاح ^_^ ", Toast.LENGTH_SHORT).show();
                        }else {
                            Toast.makeText(RegisterActivity.this, "فشل التسجيل", Toast.LENGTH_SHORT).show();

                        }


                    }
                });

 

وبالكود السابق الان اذا تم التسجيل بنجاح فسيتم اظهار التوست للمستخدم أنه تم تسجيله بنجاح وفى حالة الفشل سيتم اظهار توست فشل التسجيل ولعلك لاحظت انه يتم تمرير Task فى onComplete وليس register مثلا ونقول register.isSuccessfull لان onComplete تستخدم مع الامور الاخرى كتسجيل الدخول واسترجاع الايميل وتحديث البيانات الخ .. لذلك تعتبر  task وهو معنى اشمل .

لكن أحيانا تريد ان تعرف سبب فشل التسجيل والسبب الاكثر شيوعا والذى نهتم به هو موضوع أن الايميل مسجل من قبل وللأسف لا توفر Firebase ميثود مباشرة لتنفيذ هذا لكن يمكنك تحقيق ذلك عن طريق جلب رسالة الفشل وبالتالى مقارنتها بالرسالة التى تظهر ان كان الايميل مسجل من قبل كالتالى :

  FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(RegisterActivity.this, "تم تسجيلك بنجاح ^_^ ", Toast.LENGTH_SHORT).show();
                        } else {
                            // if email already registerd
                            if (task.getException().getMessage().equals("The email address is already in use by another account.")) {
                                Toast.makeText(RegisterActivity.this, "هذا الايميل مستخدم من قبل", Toast.LENGTH_SHORT).show();

                            }

                            Toast.makeText(RegisterActivity.this, "فشل التسجيل", Toast.LENGTH_SHORT).show();

                        }


                    }
                });

 

هذا كل ما فى الأمر طبعا قد تريد اضافة بعض البيانات الاخرى للمستخدم كالاسم أو رابط صورة البروفايل ويمكنك فعل ذلك عن طريق استخدام الكلاس FacebookUser  لكن قبل ذلك سنتعلم كيفية تسجيل الدخول

– تسجيل الدخول

يمكنك تسجيل الدخول ايضا باستخدام الكلاس FirebaseAuth  لكن هذه المرة سنستخدم الميثود signInWithEmailAndPassword كالتالى وسيكون ذلك بداخل أكتيتفى Login الذى انشأناه سابقا  عند الضغط على الزر login

ببساطه يشبه كثيرا الكود السابق الخاص بتسجيل مستخدم جديد لكن بدلا من اعطاءه الإيميل والباسورد واستخدام الميثود createUserWithEmailAndPassword قمنا باستخدام الميثود signInWithEmailAndPassword وأعطيناها الايميل والباسورد لتبدأ عملية تسجيل الدخول وقمنا ايضا باضافة Listener يستمع او يراقب العملية حيث تستدعى الميثود onComplete عند انهاء عملية تسجيل الدخول ونقوم بالتأكد أنه تم تسجيل الدخول بنجاح بهذا الايميل وهذا الباسورد ام لا عن طريق if(task.isSuccessful) اذا كانت العملية ناجحة يعنى ان الايميل والباسورد صحيح ونقوم باتخاذ اى اجراء نريد والذى يكون غالبا نقل المستخدم للصفحة الرئيسية للتطبيق .

 

– البيانات الاضافية للمستخدم

الايميل والباسور لا يكفى اغلب الاحيان لإنشاء نظام تسجيل دخول فنحتاج احيانا لصورة للمستخدم وايضا اسم يعرض فبالتأكيد ان كان التطبيق يحتوى على تعليقات مثلا فسوف تظهر اسماء الناس فى التعليقات الاسم والتعليق وسيكون من غير المنطقى اظهار الايميل والتعليق وهكذا اى موقف اخر يقتضى عرض اسم المستخدم  لذلك توفر لنا firebase  كلاس الـ FirebaseUser لإدارة بيانات المستخدم حيث يمكننا الحصول على اليوزر الحالى الذى سجل الدخول او الذى سجل فى التطبيق من خلال الـ task كالتالى :

الان قمنا بامساك اليوزر بريفرنس من النوع FirebaseUser وبسهولة نستطيع تعديل وتحديث بيانات المستخدم وكذلك اضافة الاسم ورابط الصورة الخاصة بالمستخدم

أحد الميثودث المتوفرة فى كلاس FirebaseUser هى ميثود updateProfile وتأخذ باراميتر من النوع UserProfileChangeRequest وهو عباره عن ريكوست يتم بناؤه لتحديث اسم المستخدم ورابط صورة المستخدم

ويتم تنفيذه كالتالى :

                    FirebaseUser user = task.getResult().getUser();

                            UserProfileChangeRequest userProfileChangeRequest = new UserProfileChangeRequest.Builder()
                                    .setDisplayName("Ahmed Hendi")
                                    .setPhotoUri(Uri.parse("https://pixabay.com/static/uploads/photo/2016/06/20/16/37/rope-1469244__340.jpg"))
                                    .build();

                            user.updateProfile(userProfileChangeRequest);

والكود السابق قمت بوضعه داخل if task successful يجلب اليوزر الحالى ويحدث البيانات من اسم المستخدم وكذلك الصورة عن طريق بناء ريكوست وتمريره الى الميثود updateProfile   ليتم تحديث اسم المستخدم الى Ahmed Hendi ورابط الصورة https://pixabay.com/static/uploads/photo/2016/06/20/16/37/rope-1469244__340.jpg ولعلك تتسائل الان لما وضعنا رابط ولم نجلب صورة من اختيار المستخدم مباشرة والاجابة لانFirebase Authentication  لا تدعم تخزين الصور مباشرة يمكنك رفع الصور والحصول على الرابط الخاص بالصورة بعد الرفع برمجيا ثم وضع الرابط فى setPhotoUri  يمكنك مراجعة درس Android Webservices بالعربية – رفع الملفات من الأندرويد للسيرفر  لتعلم طريقة رفع الصور والملفات فى الاندرويد اذا لم يكن لديك خبرة بالامر والان نكون حدثنا البيانات الخاصة بالمستخدم بنجاح والتى تتضمن اسم المستخدم ورابط الصورة . والان تستطيع استدعاء هذه البيانات فى اى وقت وفى اى مكان تريد فى التطبيق طالما المستخدم قد سجل الدخول عن طريق

        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

والوصل لكل بيانات المستخدم بالميثودث المتوفرة user.getDisplayname(); تعود لك بالاسم ك String و user.getPhotoUrl() تعود برابط الصورة الشخصية او صورة البروفايل للمستخدم بالاضافة لبعض الـميثودث الاخرى كـ user.getEmail() والتى تعود لك بالايميل الحالى للمستخدم و user.getUserID والتى تعود لنا بالـ ID الخاص بالمستخدم بالاضافة لجلب بيانات المستخدم  يمكنك ايضا تحديث البيانات الاضافية للمستخدم بشكل سريع مثل تحديث الايميل user.updateEmail(String newEmail) والتى تقوم بتحديث ايميل هذا المستخدم مباشرة  وكذلك تحديث الباسورد بنفس الطريقة user.updatePassword(String newPassword)
اما اذا اردت تحديث صورة المستخدم او تحديث الاسم ستقوم بانشاء UserProfileChangeRequest وتمريره الى الميثود user.updateProfile كما فعلنا قبل قليل .

 

– استعادة كلمة المرور

يمكنك استعادة كلمة المرور للمستخدم ببساطه عن طريق استخدام الميثود sendPasswordResetEmail

طبعا فى الاستخدام الفعلى لها سوف تقوم بعمل صفحة أو Activity لاستعادة الباسورد وتطلب من المستخدم ادخال ايميله وعند الضغط على زر استعادة او reset يتم تنفيذ السطر السابق واستعادة الباسورد عنطريق ارسال ايميل للمستخدم كما فى كل انظمة استعادة الباسورد فى التطبيقات والمواقع الاخرى

 

وتقوم  Firebase بإرسال ايميل لاستعادة الباسورد وكذلك عند تغيير الايميل تلقائيا ويمكنك التحكم فى صيغة الايميل عن طريق الـ Email Templates من الـ Console

 

– تسجيل الخروج

يمكن تسجيل خروج المستخدم ببساطه باستخدام ميثود signOut()

        FirebaseAuth.getInstance().signOut();

 

– حذف المستخدم 

يمكنك حذف المستخدم بكل بساطة باستخدام الميثود delete  الموجودة ب FirebaseUser كالتالى

        user.delete();

 

 

فى كل العمليات السابقة يمكنك استخدام الميثود .addOnCompleteListener واضافة Listener لاى عملية سابقة سواء تحديث بيانات المستخدم او تعديلها او اى امر اخر لمراقبة هل تمت العملية بنجاح ام لا :

وعند الاستخدام الفعلى ل FirebaseAuth.getInstacne() يجب عليك امساكها بريفرنس FirebaseAuth كالتالى

 

ودائما تستخدم auth للتسهيل ولا تنادى FirebaseAuth.getInstance() كل مرة

auth. ثم استخدام الميثود التى تريدها .

 

الخلاصة 

Firebase  Authentication توفر عليك الكثير من العمل والمجهود فى الاندرويد وفى الباك اند وتوفر لك طريقة سهله ورائعة لبرمجة تسجيل الدخول والتسجيل فى تطبيقك بكل بساطة وباقل كود ممكن

 

السابق
FCM بالعربية – Firebase Cloud Messaging الجزء الثانى
التالي
درس Firebase Realtime Database

17 تعليق

أضف تعليقا

  1. medoo قال:

    درس رائع جدا جدا نشكر الجهود عليه
    عندي سؤالين الأول بملف ال xml في المكان المخصص لل input كيف ممكن ياخد هاد الشكل ؟
    السؤال الثاني
    صفحة تسجيل الدخول ستظهر مرة واحد فقط ولا لازم استخدم دالة عرض لمرة واحدة ولا كيف ؟

    1. Hendiware قال:

      مرحبا medoo
      نورت الدرس والموقع
      قمنا بعمل تدوينة سابقنا للحديث عن كيفية انشاء custom drawables يمكنك الاطلاع عليها من هنا
      إحترف الـ Custom Drawables واصنع تصاميم رائعة
      /

      فى التطبيق الفعلى لنظام تسجيل الدخول
      يجب أن تقوم أولا بفحص اذا ما كان هناك مستخدم مسجل الدخول من قبل ام لا اذا كان نعم تسمح له بالدخول للتطبيق اذا كان لا توجهه لصفحة تسجيل الدخول الكود التالى يقوم بالمهمة :

      FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
      if (user != null) {
          // User is signed in
      } else {
          // No user is signed in
      }
  2. المهدي قال:

    بارك الله فيكم صراحة تعتبر مدونتكم من أحسن المدونات العربية وفقم الله

    1. Hendiware قال:

      نورت الموقع يا المهدى شكرا لك ^_^

  3. Abuhassan قال:

    شكرا لك عزيزي الكريم على هذا الطرح الجميل…. وليتني متفرغاً للغوص في هذا العالم الكبير والمتجدد والمتطور بشكل سريع
    لي طلب-إن أحببت ولو مدفوعاً- تطبيقاً لمشروع صغيراً فقط لما تم ذكره في هذا المقال تسجيل ودخول واعادة كلمة السر وتحديث البيانات ورفع الصورة ووووإلخ
    فقط ، اعتقد أن الكثيرين مثلي لن يستطيعوا مجارات هذه التطورات السريعة فلست متخصصاً ولكني هاوياً ولدي مشروع في نهاياته ومقالك هذا بشرني بأن لدي طريقة جديدة وسريعة لتسجيل المستخدمين وإدارتهم..
    على العموم اخي…. إن احببت نشره في مقالك احتساباً لأجر مشاركة المعلومة فبارك الله فيك وإن كنت تريد مقابل لطلبي فأبشر.. فالتطبيق سيختصر علي الكثير من الجهد والوقت
    انتظر ردك عزيزي

    1. Hendiware قال:

      مرحبا Abuhassan
      اذا قرأت المقال ثانية وقمت بالتركيز فى الخطوات فستجد الامر بسيط جدا وتستطيع تطبيقه بسهولة لا تتعجل وقم بقراءة المقال مرة أخرى واذا واجهتك مشكلة او لديك استفسار قم بطرحها فى مجتمع الدعم Hendiware Developers .

      1. Abuhassan قال:

        شكرا عزيزي..
        لقد قمت بتطبيق الدرس سطراً سطراً لكن لم يتم تسجيل أي مستخدم لي ما يقرب أكثر من 24ساعة وأنا في هذه المحاولات..
        قمت أخيراُ بتنزيل أمثلة التطبيقات firebase من موقعهم وشغلته على الاستديو وقمت برفع جسون الجديد للباكج ونفس الحالة لم يسجل مستخدم جديد
        ارجو المساعدة…إن سنحت لك فرصة ومستعد إرسال المشروع للاطلاع عليه أما موقع فير بيس فكل شي عملته كما أوضحت أنت
        هل هناك خطوة ناقصة لا أدري… انتظرك أخي… وشكرا لك

  4. أحمد ناصر قال:

    مجهود رائع جدا
    جزاك الله خيرا
    استمر

    1. Hendiware قال:

      وجزاك يا أحمد
      نورت ^_^

  5. أبو شهد قال:

    جزاكم الله خير الجزاء ..
    لدي سؤال يتعلق بال firebase في الخطة المجانية ..
    ما القصد من عدد الاتصالات في الوقت الواحد 100 ..
    يعني هل لو استخدم firebase في نظام التسجيل والدخول لا يتسطيع التسجيل 100 شخص في وقت واحد ..
    وأيضا في التنبيهات .. مثلا لو اريد اعمل تطبيق وعند اضافة اي موضوع جديد لا استطيع ان ارسل الا 100 شخص في وقت واحد
    ممكن تفيدوني عن الخطة المجانية أكثر .. وشكرا لكم

    1. نوال سلامه قال:

      السلام عليكم
      بالنسبه لنظام التسجيل….
      سألت نفس السؤال على StackOverflow وكان هذا هو الرد
      authentication is free, but if you have the free version, only 100 connections are allowed . Otherwise you have to pay something

  6. ahmed قال:

    شكرا جزيلا لك و احب ان اقول لك ان كدونتك ادخل عليها بشكل يومى و ارجو الاستمرار
    و شكرا

  7. عبدالله النجار قال:

    شرح رائع

  8. قصي قال:

    اخي انا اواجه مشكلة في عمل auth ممكن تساعدني

  9. Abuhassan قال:

    أخي العزيز، لقد نجحت في اضافة التسجيل عبر قوقل وتويتر لكن واجهتني مشكلة وهي تحديد الطريقة التي سجل بها المستخدم سواء قوقل او تويتر
    ما أريده الكود الخاص الذي يحدد لي أي الطريقتين استخدمها المستخدم للتسجيل كي استطيع التعامل معها في البروفايل الخاص لكل مستخدم في تطبيقي

    وشكرا لك على شرحك الرائع والمفيد…

  10. sadi قال:

    كيف ممكن اعمل فحص على عملية FirebaseAuth.getInstance().signOut();

  11. خبيب قال:

    السلام عليكم ورحمة الله وبركاته.. اعزائي شكرا جزيلا على هذا الشرح الجميل .. هل يوجد أي شرح مماثل لتطبيقات الويب .. انتظرك أخي ..رمضان كريم

اترك تعليقاً

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.