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

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

قبل البدء

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

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

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

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

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

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

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

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

  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();