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

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

قبل البدء

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

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

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

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

فئة Auth هي البوابة لجميع طلبات البيانات من واجهة برمجة التطبيقات.
  1. أضِف ملفَي رأس Auth وApp:
    #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. بعد إعداد بيانات الموفّر، استخدِمها لإنشاء FederatedOAuthProvider.

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

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

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

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

الخطوات التالية

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

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

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

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

لتسجيل خروج مستخدم، استخدِم SignOut():

auth->SignOut();