احراز هویت با استفاده از یاهو و سی پلاس پلاس

می‌توانید به کاربران خود اجازه دهید با Firebase با استفاده از ارائه‌دهندگان OAuth مانند Yahoo با یکپارچه‌سازی OAuth Login عمومی مبتنی بر وب در برنامه خود با استفاده از Firebase SDK برای انجام جریان ورود به سیستم از انتها به سیستم، احراز هویت کنند. از آنجایی که این جریان به استفاده از SDK های Firebase مبتنی بر تلفن نیاز دارد، فقط در پلتفرم های اندروید و اپل پشتیبانی می شود.

قبل از شروع

  1. Firebase را به پروژه C++ خود اضافه کنید .
  2. در کنسول Firebase ، بخش Auth را باز کنید.
  3. در زبانه روش ورود ، ارائه دهنده یاهو را فعال کنید.
  4. شناسه مشتری و Client Secret را از کنسول توسعه دهنده آن ارائه دهنده به پیکربندی ارائه دهنده اضافه کنید:
    1. برای ثبت نام سرویس گیرنده Yahoo OAuth، مستندات توسعه دهنده یاهو را در مورد ثبت یک برنامه وب در Yahoo دنبال کنید.

      حتماً دو مجوز OpenID Connect API را انتخاب کنید: profile و email .

    2. هنگام ثبت برنامه در این ارائه دهندگان، مطمئن شوید که دامنه *.firebaseapp.com برای پروژه خود به عنوان دامنه تغییر مسیر برای برنامه خود ثبت کنید.
  5. روی ذخیره کلیک کنید.

دسترسی به firebase::auth::Auth

کلاس Auth دروازه همه تماس‌های API است.
  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);
    

جریان ورود به سیستم را با Firebase SDK مدیریت کنید

برای مدیریت جریان ورود به سیستم با Firebase SDK، این مراحل را دنبال کنید:

  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 OAuth مراجعه کنید. توجه داشته باشید که نمی‌توانید پارامترهای مورد نیاز Firebase را با custom_parameters() ارسال کنید. این پارامترها عبارتند از client_id , redirect_uri , answer_type , scope و state .

  3. اختیاری : دامنه های OAuth 2.0 اضافی را فراتر از profile و email که می خواهید از ارائه دهنده احراز هویت درخواست کنید، مشخص کنید. اگر برنامه شما نیاز به دسترسی به داده‌های کاربر خصوصی از APIهای یاهو دارد، باید مجوزهای APIهای یاهو را تحت مجوزهای API در کنسول توسعه‌دهنده یاهو درخواست کنید. دامنه های درخواستی OAuth باید دقیقاً مطابق با موارد از پیش پیکربندی شده در مجوزهای API برنامه باشد. به عنوان مثال، اگر دسترسی خواندن/نوشتن به مخاطبین کاربر درخواست شود و در مجوزهای API برنامه از قبل پیکربندی شده باشد، باید 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");
    

    برای کسب اطلاعات بیشتر، به مستندات حوزه یاهو مراجعه کنید.

  4. هنگامی که داده های ارائه دهنده شما پیکربندی شد، از آن برای ایجاد یک FederatedOAuthProvider استفاده کنید.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. با استفاده از شی ارائه دهنده Auth با Firebase احراز هویت کنید. توجه داشته باشید که برخلاف سایر عملیات FirebaseAuth، این کار با نمایش یک نمای وب که در آن کاربر می‌تواند اعتبار خود را وارد کند، رابط کاربری شما را کنترل می‌کند.

    برای شروع جریان ورود به سیستم، با SignInWithProvider تماس بگیرید:

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

    سپس درخواست شما ممکن است منتظر بماند یا در Future یک تماس برگشتی ثبت کند .

  6. در حالی که مثال‌های بالا بر جریان‌های ورود به سیستم تمرکز دارند، شما همچنین می‌توانید با استفاده از 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();