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

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام موفّري بروتوكول OAuth مثل Yahoo، وذلك من خلال دمج الطريقة العامة لتسجيل الدخول عبر بروتوكول OAuth في تطبيقك باستخدام حزمة تطوير البرامج (SDK) لمنصة Firebase لإجراء عملية تسجيل الدخول من البداية إلى النهاية.

قبل البدء

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

  1. أضِف Firebase إلى مشروع Android الخاص بك.

  2. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  3. في علامة التبويب طريقة تسجيل الدخول، فعِّل مزوِّد خدمة Yahoo.
  4. أضِف معرّف العميل وسر العميل من وحدة تحكّم المطوّرين لدى موفِّر الخدمة إلى إعدادات الموفّر:
    1. لتسجيل عميل OAuth، اتّبِع مستندات Yahoo الخاصة بالمطوّرين حول تسجيل تطبيق ويب من خلال Yahoo.

      تأكّد من اختيار إذنَي OpenID Connect API: profile وemail.

    2. عند تسجيل التطبيقات مع هؤلاء المزوّدين، احرص على تسجيل النطاق *.firebaseapp.com لمشروعك كنطاق إعادة توجيه لتطبيقك.
  5. انقر على حفظ.
  6. إذا لم تكن قد حددت بصمة SHA-1 لتطبيقك حتى الآن، يمكنك إجراء ذلك من صفحة الإعدادات في وحدة تحكم Firebase. يُرجى الرجوع إلى صفحة مصادقة العميل للحصول على مزيد من التفاصيل حول كيفية الحصول على بصمة إصبع SHA-1 لتطبيقك.

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

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

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

  1. يمكنك إنشاء مثيل لـ OAuthProvider باستخدام Builder التابع له مع معرّف المزوّد yahoo.com.

    Kotlin+KTX

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

    Java

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

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

    Kotlin+KTX

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login")
    
    // Localize to French.
    provider.addCustomParameter("language", "fr")

    Java

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login");
    
    // Localize to French.
    provider.addCustomParameter("language", "fr");

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

  3. اختياري: حدِّد نطاقات OAuth 2.0 الإضافية بعد profile وemail التي تريد طلبها من موفِّر المصادقة. إذا كان تطبيقك يتطلّب الوصول إلى بيانات المستخدمين الخاصة من واجهات برمجة تطبيقات Yahoo API، عليك طلب أذونات لواجهات برمجة تطبيقات Yahoo API، وذلك ضمن أذونات واجهة برمجة التطبيقات في وحدة تحكّم المطوّرين في Yahoo. يجب أن تكون نطاقات OAuth المطلوبة مطابقة تامة للنطاقات التي تم ضبطها مسبقًا في أذونات واجهة برمجة التطبيقات للتطبيق. على سبيل المثال، إذا تم طلب الوصول للقراءة/الكتابة إلى جهات اتصال المستخدم وتم ضبطه مسبقًا في أذونات واجهة برمجة التطبيقات للتطبيق، يجب تمرير sdct-w بدلاً من نطاق OAuth للقراءة فقط sdct-r. وإلا، فسيفشل التدفق وسيظهر خطأ للمستخدم النهائي.

    Kotlin+KTX

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = listOf("mail-r", "sdct-w")

    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>() {
                {
                    // Request access to Yahoo Mail API.
                    add("mail-r");
                    // This must be preconfigured in the app's API permissions.
                    add("sdct-w");
                }
            };
    provider.setScopes(scopes);
    لمزيد من المعلومات، يمكنك مراجعة مستندات Yahoo الخاص بالنطاقات.

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

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

    لمعرفة ما إذا كانت هناك نتيجة معلّقة، يمكنك الاتصال بـ 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، يمكنك طلب Yahoo API.

    حيث YAHOO_USER_UID هو رقم تعريف مستخدم Yahoo الذي يمكن تحليله من حقل firebaseAuth.getCurrentUser().getProviderData().get(0).getUid() أو من authResult.getAdditionalUserInfo().getProfile().

  5. على الرغم من أنّ الأمثلة أعلاه تركّز على إجراءات تسجيل الدخول، يمكنك أيضًا ربط مقدّم خدمة Yahoo بمستخدم حالي باستخدام 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.
                        }
                    });

  6. ويمكن استخدام النمط نفسه مع 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();