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

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

قبل البدء

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

  1. أضِف Firebase إلى مشروع Android.

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

      احرص على اختيار إذنَي واجهة برمجة التطبيقات اتصال OpenID: profile وemail.

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

التعامل مع عملية تسجيل الدخول باستخدام حزمة Firebase SDK

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

للتعامل مع عملية تسجيل الدخول باستخدام حزمة Firebase Android SDK، اتّبِع الخطوات التالية:

  1. أنشِئ مثيلاً من OAuthProvider باستخدام المنشئ مع معرّف الموفّر yahoo.com.

    Kotlin

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

    Java

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

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

    Kotlin

    // 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، عليك طلب الأذونات للوصول إلى واجهات برمجة تطبيقات Yahoo ضمن أذونات واجهة برمجة التطبيقات في وحدة تحكّم المطوّرين في Yahoo. يجب أن تتطابق نطاقات OAuth المطلوبة تمامًا مع النطاقات التي تم ضبطها مسبقًا في أذونات واجهة برمجة التطبيقات في التطبيق. على سبيل المثال، إذا تم طلب إذن الوصول للقراءة والكتابة إلى جهات اتصال المستخدم وتم ضبطه مسبقًا في أذونات واجهة برمجة التطبيقات في التطبيق، يجب تمرير sdct-w بدلاً من نطاق OAuth للقراءة فقط sdct-r. وإلا، ستفشل العملية وسيظهر خطأ للمستخدم النهائي.

    Kotlin

    // 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

    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، يمكنك استدعاء الـ Yahoo API.

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

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

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