المصادقة باستخدام Twitter على Android

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام حساباتهم في Twitter عن طريق دمج معلومات تسجيل الدخول العامة عبر بروتوكول OAuth المستند إلى الويب في تطبيقك باستخدام حزمة SDK لمنصة Firebase لتنفيذ عملية تسجيل الدخول من البداية إلى النهاية.

قبل البدء

لتسجيل دخول المستخدمين باستخدام حسابات Twitter، يجب أولاً تفعيل Twitter باعتباره مزوّد تسجيل الدخول لمشروع Firebase:

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

  2. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  3. في علامة التبويب طريقة تسجيل الدخول، فعِّل مقدّم خدمة Twitter.
  4. أضِف مفتاح واجهة برمجة التطبيقات وسر واجهة برمجة التطبيقات من وحدة تحكّم المطوّرين لدى مقدّم الخدمة إلى إعدادات الموفّر:
    1. سجِّل تطبيقك كتطبيق مطوِّر على Twitter واحصل على مفتاح واجهة برمجة التطبيقات OAuth وسر واجهة برمجة التطبيقات الخاصَين بتطبيقك.
    2. تأكَّد من ضبط معرّف الموارد المنتظم (URI) لإعادة توجيه OAuth في Firebase (مثل my-app-12345.firebaseapp.com/__/auth/handler) باعتباره عنوان URL لمعاودة الاتصال بالتفويض في صفحة إعدادات تطبيقك على إعدادات تطبيق Twitter.
  5. انقر على حفظ.
  6. في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle)، أضِف التبعية لمكتبة مصادقة Firebase لنظام التشغيل Android. ننصحك باستخدام برنامج Firebase Android BoM للتحكّم في إصدارات المكتبة.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
    
        // 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")
    }
    

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

    (بديل) أضِف تبعيات مكتبة Firebase بدون استخدام قائمة BoM.

    إذا اختَرت عدم استخدام قائمة مشروعات Firebase، يجب تحديد كل إصدار من إصدارات مكتبة 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.0.0")
    }
    
    هل تبحث عن وحدة مكتبة خاصة بلغة Kotlin؟ اعتبارًا من تشرين الأول (أكتوبر) 2023 ( Firebase BoM 32.5.0)، أصبح بإمكان مطوّري لغتَي Kotlin وJava الاعتماد على وحدة المكتبة الرئيسية (لمعرفة التفاصيل، يُرجى الاطّلاع على الأسئلة الشائعة حول هذه المبادرة).

  7. إذا لم تكن قد حددت بصمة SHA-1 لتطبيقك حتى الآن، يمكنك إجراء ذلك من صفحة الإعدادات في وحدة تحكم Firebase. يُرجى الرجوع إلى صفحة مصادقة العميل للحصول على مزيد من التفاصيل حول كيفية الحصول على بصمة إصبع SHA-1 لتطبيقك.

معالجة عملية تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase

إذا كنت تنشئ تطبيقًا Android، فإن أسهل طريقة لمصادقة المستخدمين من خلال Firebase باستخدام حساباتهم على Twitter هي التعامل مع عملية تسجيل الدخول بالكامل باستخدام Firebase Android SDK.

للتعامل مع عملية تسجيل الدخول باستخدام حزمة تطوير البرامج (SDK) لنظام التشغيل Android لمنصة Firebase، اتّبِع الخطوات التالية:

  1. إنشاء مثيل لـ OAuthProvider باستخدام أداة الإنشاء الخاصة به باستخدام معرِّف موفِّر الخدمة Twitter.com

    Kotlin+KTX

    val provider = OAuthProvider.newBuilder("twitter.com")

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("twitter.com");

  2. اختياري: حدِّد معلَمات OAuth الإضافية المخصّصة التي تريد إرسالها مع طلب OAuth.

    Kotlin+KTX

    // Localize to French.
    provider.addCustomParameter("lang", "fr")

    Java

    // Localize to French.
    provider.addCustomParameter("lang", "fr");

    للتعرّف على المَعلمات المتوافقة مع Twitter، يمكنك الاطّلاع على مستندات OAuth الخاصة بـ Twitter. تجدر الإشارة إلى أنّه لا يمكنك ضبط المَعلمات المطلوبة لمنصّة Firebase مع setCustomParameters(). وهذه المَعلمات هي client_id وResponse_type وredirect_uri وstate وscope وresponse_mode.

  3. يمكنك المصادقة مع Firebase باستخدام كائن موفّر OAuth. على عكس عمليات FirebaseAuth الأخرى، سيتحكم هذا الإجراء في واجهة المستخدم من خلال فتح علامة تبويب مخصّصة في Chrome. نتيجةً لذلك، يُرجى عدم الإشارة إلى نشاطك في OnSuccessListener وOnFailureListener اللذَين ترفقهما لأنّه سيتم فصلهما على الفور عند بدء العملية في واجهة المستخدم.

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

    لمعرفة ما إذا كانت هناك نتيجة معلّقة، يمكنك الاتصال بـ getPendingAuthResult:

    Kotlin+KTX

    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+KTX

    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، يمكنك طلب Twitter API.

    على سبيل المثال، للحصول على معلومات الملف الشخصي الأساسية، يمكنك استدعاء واجهة برمجة تطبيقات REST، مع تمرير رمز الدخول في عنوان Authorization:

  4. على الرغم من أنّ الأمثلة أعلاه تركّز على عمليات تسجيل الدخول، يمكنك أيضًا ربط مقدّم خدمة Twitter بمستخدم حالي باستخدام startActivityForLinkWithProvider. على سبيل المثال، يمكنك ربط عدة مقدّمي خدمات بالمستخدم نفسه، ما يسمح لهم بتسجيل الدخول باستخدام أي منهما.

    Kotlin+KTX

    // 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.
                        }
                    });

  5. ويمكن استخدام النمط نفسه مع startActivityForReauthenticateWithProvider الذي يمكن استخدامه لاسترداد بيانات الاعتماد الجديدة للعمليات الحساسة التي تتطلّب تسجيل الدخول مؤخرًا.

    Kotlin+KTX

    // 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 في الوقت الفعلي وقواعد الأمان في Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من خلال المتغيّر auth، واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

لتسجيل خروج المستخدم، يمكنك الاتصال على signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();