ahmdsat
ahmdsat
عضو شرف
المساهمات :
42
النقاط :
82
التقيم :
1
الاوسمة :
Firebase Authentication | تسجيل الدخول باستخدام حساب Google Crown_gold
  نبدأ أولاً بإنشاء مشروع جديد على Firebase Console ومشروع جديد على Android Studio ونقوم بربطهم (كما فعلنا في درس Firebase Real-time Database) ثم نضيف مكتبة Firebase Auth في مشروع الأندرويد
الكود:

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

ونضيف مكتبة Google
الكود:

compile 'com.google.android.gms:play-services-auth:10.2.1'

ونعمل Sync لGradle وبالطبع نُفعل خيار Google من Firebase Console
أما الآن فإننا نحتاج لشيئ يُسمى SHA1 Fingerprint لربطه في Firebase مع تطبيقنا,ويمكنك الحصول عليه عبر تطبيق الخطوات في هذا الشرح أو   اذا كنت تستخدم الويندوز يمكنك تحميل هذه الأداةالصغيرة التي صنعتها والتي تسهل عليك الأمر
 بعد تحميل الأداة وفك الضغط عنها سنجد هذه الملفات
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
مايهمنا هو الملفات Genreate Debug Key Google و Genreate Release Key Google
الDebug يقوم بتوليد SHA1 اذا كنت ضمن مرحلة التطوير
نقوم بفتح الملف ونرى ان الأداة تطلب keystore password والتي عادةً تكون "android"
وسنرى أنه تم توليد SHA1 
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
الRelease عندما تقوم بعمل Release للتطبيق(عندما تقوم بتوليد ملف وشهادة بصيغة jks)
نقوم بفتح الملف وسنجد انه سيطلب alias الذي قد قمت بوضعه عندما قمت بعمل Generate Signed APK 
بعد ذلك سيطلب منك مسار ملف key الذي ينتهي بصيغة jks
ثم الباسوورد
بعد ذلك سيتم توليد الSHA1
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]

 
قم بنسخه ثم توجه الى Firebase Console ثم اختر Project Settings
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
وانزل للأسفل واختر Add Fingerprint ثم الصق SHA1 الذي نسخته واختر Save
 
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
بعد ذلك عليك الذهاب لموقع Google Developers Console للحصول على ClientID سنضعه لاحقاً في مشروع الأندرويد (تأكد من أنه نفس اسم المشروع الذي تعمل عليه في Firebase) ستجد في الأسفل Web Client قم بنسخ Client ID بنوع Web Application (سنحتاجه لاحقاً)
 
أما الآن نعود الى Android Studio الى activity_main.xml ونضيف زر من نوع SignInButton وهو زر عادي ولكن بشكل جميل وعليه شعار Google
 
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
بعد ذلك في MainActivity.java سنقوم بتعريف بعض المتغيرات
 
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 

  • mAuth شرحناها سابقاً
  • GoogleApiClient مهمته إظهار حسابات Google الموجودة في جهاز الأندرويد
  • SigninButton زر تسجيل الدخول في activity_main.xml
  • RC_SIGN_IN وهو متغير من نوع int عادي سنستخدمه لاحقاً قيمته 0 (يمكنك وضع أي قيمة تريدها)

 
ثم داخل onCreate أعطينا قيمة ل mAuth وعرفنا اوبجكت من GoogleSignInOptions,هذه الميثود مهمتها وضع الإعدادات ليعرف GoogleApiClient ماذا نريد منه, حيث أن Google API Client يحتوي على الكثير من APIs منها Drive API و Google Play Games API الخ..
ثم أعطيناه IDToken (الذي نسخناه سابقاً من Google Developers Console) 
وطلبنا إظهار Email (RequestEmail)
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
بعد ذلك علينا تعريف GoogleApiClient ونعطيه gso الذي قمنا بتعريفه
 
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
أخيراً نربط SignInButton وعند الضغط عليه نستدعي ميثود signIn التي سننشأها الآن

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
داخل ميثود SignIn نقوم بتعريف Intent خاص من Auth ونعطيه mGoogleApiClient ,هذا الأكتفتي هو الذي يظهر حسابات Google الموجودة في الجهاز
 
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
ثم نشغل الأكتفتي ولكن بدلاً من startActivity سنستدعي startActivityForResult ونضع signInIntent و RC_SIGN_IN
لماذا وضعنا startActivityForResult؟
 ببساطة لأننا نريد أن نعرف نتيجة تشغيل هذا الأكتفتي ,على سبيل المثال هل تم اختيار حساب Google أم أن المستخدم قد رفض هذا الأمر
ولمعرفة النتيجة نقوم بعمل Override ل onActivityResult ,هذه الميثود تقوم بإعادة النتيجة وليست فقط ل Google Auth
,فعلى سبيل المثال يمكنك عمل startActivityForResult اذا كنت تريد مثلاً من المستخدم اختيار صورة من الجهاز وبالتالي تريد معرفة هل تم اختيار هذه الصورة أم لا
وللتميز بين results نستخدم رقم int ونقوم بعمل if اذا كان request code == RC_SIGN_IN عندها سنقوم بإنشاء GoogleSignInResult ونعطيه data
وإذا كانت result.isSuccess ناجحة أي أنه تم اختيار حساب من قبل المتسخدم عندها سنقوم بإنشاء GoogleSignInAccount ونأخذه من result.
  الى هذه اللحظة لم يتم تسجيل الحساب في Firebase ولذلك سنستدعي ميثود firebaseAuthWithGoogle  ونعطيه account
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
أما الآن سنقوم بإنشاء ميثود firebaseAuthWithGoogle وهي تأخذ GoogleSignInAccount ك بارامتر ثم عرفنا AuthCredential وقمنا بإعطاءه الtoken الخاص بالحساب عبر ميثود acct.getIdToekn أخيراً استعملنا mAuth.signInWithCredential وأضفنا CompleteListener لمعرفة نتيجة العملية
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
أما الآن حان وقت التجربة نشغل التطبيق ونضغط على زر SignIn سيتم إظهار نافذة تطلب إختيار حساب كما في الصورة
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
وإذا تمت العملية بنجاح سنجد النتيجة في Logcat
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
 
سنذهب ل Firebase Console لنرى هل تم التسجيل بنجاح
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]
بالطبع يمكنك معرفة هل تم تسجيل الدخول من قبل المستخدم أم لا عبر AuthStateListener كما فعلنا في الدرس السابق
 
ملاحظة:المشروع على Github للمعاينة فقط ولايمكنك تجربته على Android Studio لعدم وجود google-services.json الخاص بك  
avatar
Dr.MaYaR
المؤسس
المساهمات :
123
النقاط :
241
التقيم :
34
يعطيك العافية على الموضوع
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى