يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase من خلال حساباتهم على GitHub عن طريق دمج ميزة تسجيل الدخول العام المستند إلى الويب باستخدام بروتوكول OAuth في تطبيقك باستخدام Firebase SDK لتنفيذ عملية تسجيل الدخول من البداية إلى النهاية.
قبل البدء
لتسجيل دخول المستخدمين باستخدام حساباتهم على GitHub، عليك أولاً تفعيل GitHub كمزوّد لتسجيل الدخول في مشروعك على Firebase:
أضِف Firebase إلى مشروعك على Android إذا لم يسبق لك إجراء ذلك، أضِف Firebase إلى مشروعك على Android.
- في Firebase Console، انتقِل إلى الأمان > المصادقة.
- في علامة التبويب طريقة تسجيل الدخول ، فعِّل مزوّد تسجيل الدخول GitHub sign-in.
-
أضِف معرّف العميل وسر العميل من وحدة تحكّم المطوّرين الخاصة بمزوّد الخدمة إلى إعدادات المزوّد:
- سجِّل تطبيقك كتطبيق مطوّرين على GitHub واحصل على معرّف العميل وسر العميل لبروتوكول OAuth 2.0 في تطبيقك.
-
تأكَّد من ضبط معرّف URI لإعادة التوجيه في OAuth على Firebase (مثلاً،
my-app-12345.firebaseapp.com/__/auth/handler) كـ عنوان URL لردّ الاتصال الخاص بالتفويض في صفحة إعدادات تطبيقك على إعدادات تطبيق GitHub.
- انقر على حفظ.
في ملف 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.13.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") }
حدِّد الملف المرجعي SHA-1 لتطبيقك إذا لم يسبق لك إجراء ذلك.
في Firebase Console، انتقِل إلى
الإعدادات > علامة التبويب عام.انتقِل للأسفل إلى بطاقة تطبيقاتك ، واختَر تطبيق Android، وأضِف بصمة SHA-1 في حقل بصمات شهادة SHA.
راجِع المصادقة على عميلك للحصول على تفاصيل حول كيفية الحصول على الملف المرجعي SHA لتطبيقك.
التعامل مع عملية تسجيل الدخول باستخدام Firebase SDK
إذا كنت تعمل على إنشاء تطبيق Android، فإنّ أسهل طريقة لمصادقة المستخدمين باستخدام Firebase من خلال حساباتهم على GitHub هي التعامل مع عملية تسجيل الدخول بالكامل باستخدام Firebase Android SDK.
للتعامل مع عملية تسجيل الدخول باستخدام Firebase Android SDK، اتّبِع الخطوات التالية:
أنشِئ مثيلاً من OAuthProvider باستخدام المنشئ مع معرّف المزوّد github.com
Kotlin
val provider = OAuthProvider.newBuilder("github.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
اختياري: حدِّد مَعلمات OAuth المخصّصة الإضافية التي تريد إرسالها مع طلب OAuth.
Kotlin
// Target specific email with login hint. provider.addCustomParameter("login", "your-email@gmail.com")
Java
// Target specific email with login hint. provider.addCustomParameter("login", "your-email@gmail.com");
للمَعلمات التي يتيحها GitHub، راجِع مستندات GitHub OAuth. يُرجى العِلم أنّه لا يمكنك تمرير المَعلمات المطلوبة من Firebase باستخدام
setCustomParameters(). هذه المَعلمات هي client_id، response_type، redirect_uri، state، scope و response_mode.اختياري: حدِّد نطاقات OAuth 2.0 الإضافية التي تتجاوز الملف الشخصي الأساسي التي تريد طلبها من مزوّد المصادقة. إذا كان تطبيقك يتطلّب الوصول إلى بيانات المستخدم الخاصة من واجهات برمجة تطبيقات GitHub، عليك طلب أذونات للوصول إلى واجهات برمجة تطبيقات GitHub ضمن أذونات واجهة برمجة التطبيقات في GitHub Developer Console. يجب أن تتطابق نطاقات OAuth المطلوبة تمامًا مع النطاقات التي تم ضبطها مسبقًا في أذونات واجهة برمجة التطبيقات للتطبيق.
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("user:email")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("user:email"); } }; provider.setScopes(scopes);
صادِق باستخدام Firebase باستخدام عنصر مزوّد OAuth. يُرجى العِلم أنّه على عكس عمليات FirebaseAuth الأخرى، سيتحكّم هذا الإجراء في واجهة المستخدم من خلال عرض علامة تبويب مخصّصة في Chrome. نتيجةً لذلك، لا تشِر إلى نشاطك في
OnSuccessListenerوOnFailureListenerاللذين ترفقهما لأنّهما سيتم فصلهما على الفور عند بدء العملية في واجهة المستخدم.عليك أولاً التحقّق مما إذا سبق لك تلقّي ردّ. يؤدي تسجيل الدخول بهذه الطريقة إلى وضع نشاطك في الخلفية، ما يعني أنّه يمكن للنظام استرداده أثناء عملية تسجيل الدخول. للتأكّد من عدم مطالبة المستخدم بالمحاولة مرة أخرى في حال حدوث ذلك، عليك التحقّق مما إذا كانت هناك نتيجة حاليًا.
للتحقّق مما إذا كانت هناك نتيجة معلّقة، استخدِم
getPendingAuthResult:Kotlin
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
لبدء عملية تسجيل الدخول، استخدِم
startActivityForSignInWithProvider:Kotlin
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
عند اكتمال العملية بنجاح، يمكن استرداد رمز الدخول إلى OAuth المرتبط بمزوّد الخدمة من عنصر
OAuthCredentialالذي يتم عرضه.باستخدام رمز الدخول إلى OAuth، يمكنك استدعاء GitHub API.
على سبيل المثال، للحصول على معلومات الملف الشخصي الأساسية، يمكنك استدعاء REST API، مع تمرير رمز الدخول في عنوان
Authorization:في حين أنّ الأمثلة أعلاه تركّز على عمليات تسجيل الدخول، يمكنك أيضًا ربط مزوّد GitHub بمستخدم حالي باستخدام
startActivityForLinkWithProvider. على سبيل المثال، يمكنك ربط عدة مزوّدين بالمستخدم نفسه، ما يسمح له بتسجيل الدخول باستخدام أيّ منهم.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
يمكن استخدام النمط نفسه مع
startActivityForReauthenticateWithProviderالذي يمكن استخدامه لاسترداد بيانات اعتماد جديدة للعمليات الحسّاسة التي تتطلّب تسجيل دخول حديث.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
الخطوات التالية
بعد تسجيل دخول المستخدم للمرة الأولى، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد التي سجّل المستخدم الدخول بها، أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات مزوّد المصادقة. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase، ويمكن استخدامه لتحديد هوية المستخدم في كل تطبيق في مشروعك، بغض النظر عن طريقة تسجيل الدخول.
-
في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من الـ
FirebaseUserكائن. راجِع إدارة المستخدمين. في Firebase Realtime Database وCloud Storage قواعد الأمان، يمكنك الحصول على معرّف المستخدم الفريد للمستخدم الذي سجّل الدخول من متغيّر
auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.
يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام عدة مزوّدي مصادقة عن طريق ربط بيانات اعتماد مزوّد المصادقة بحساب مستخدم حالي.
لتسجيل خروج مستخدم، استخدِم
signOut:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();