المصادقة باستخدام Yahoo وC++

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

قبل البدء

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

      احرص على اختيار إذنَي OpenID Connect API: profile وemail.

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

الوصول إلى الصف firebase::auth::Auth

الفئة Auth هي مدخل جميع طلبات البيانات من واجهة برمجة التطبيقات.
  1. إضافة ملفَّي عناوين التطبيقات والمصادقة:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. في رمز الإعداد، أنشئ فئة firebase::App.
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
    
  3. الحصول على الصف firebase::auth::Auth لـ firebase::App هناك ربط واحد لواحد بين App وAuth.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

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

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

  1. يمكنك إنشاء مثيل لـ FederatedOAuthProviderData تم ضبطه باستخدام رقم تعريف الموفّر المناسب لـ Yahoo.

    firebase::auth::FederatedOAuthProviderData
        provider_data(firebase::auth::YahooAuthProvider::kProviderId);
    
  2. اختياري: حدِّد مَعلمات OAuth المخصّصة الإضافية التي تريد إرسالها مع طلب OAuth.

    // Prompt user to re-authenticate to Yahoo.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    

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

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

    // Request access to Yahoo Mail API.
    provider_data.scopes.push_back("mail-r");
    // This must be preconfigured in the app's API permissions.
    provider_data.scopes.push_back("sdct-w");
    

    لمزيد من المعلومات، راجِع مستندات نطاقات Yahoo.

  4. بعد ضبط بيانات موفّر الخدمة، يمكنك استخدامها لإنشاء Federated OAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. يمكنك المصادقة مع Firebase باستخدام عنصر موفّر المصادقة. تجدر الإشارة إلى أنّه على عكس عمليات FirebaseAuth الأخرى، سيتحكّم هذا الإجراء في واجهة المستخدم من خلال ظهور طريقة عرض ويب يستطيع المستخدم من خلالها إدخال بيانات الاعتماد.

    لبدء عملية تسجيل الدخول، يمكنك الاتصال بالرقم SignInWithProvider:

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    قد ينتظر طلبك بعد ذلك أو يسجّل معاودة الاتصال في المستقبل.

  6. بينما تركز الأمثلة أعلاه على مسارات تسجيل الدخول، يمكنك أيضًا ربط موفِّر Yahoo بمستخدم حالي باستخدام LinkWithProvider. على سبيل المثال، يمكنك ربط عدة مقدمي بالمستخدم نفسه مما يسمح لهم بتسجيل الدخول باستخدام أي منهما.

    firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
    
  7. يمكن استخدام النمط نفسه مع ReauthenticateWithProvider الذي يمكن استخدامه لاسترداد بيانات الاعتماد الجديدة للعمليات الحساسة التي تتطلب تسجيل دخول حديث.

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    قد ينتظر طلبك بعد ذلك أو يسجّل معاودة الاتصال في المستقبل.

الخطوات اللاحقة

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

  • في تطبيقاتك، يمكنك الحصول على معلومات الملف الشخصي الأساسية للمستخدم من العنصر firebase::auth::User:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
    
  • في قاعدة بيانات Firebase في الوقت الفعلي وقواعد أمان Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

لتسجيل خروج مستخدم، يمكنك الاتصال بالرقم SignOut():

auth->SignOut();