اصالت‌سنجی بااستفاده از Yahoo و C++‎

می‌توانید بااستفاده از ارائه‌دهندگان OAuth مانند Yahoo به کاربران اجازه دهید با Firebase اصالت‌سنجی کنند. برای این کار، «ورود به سیستم OAuth» عمومی مبتنی بر وب را بااستفاده از «کیت توسعه نرم‌افزار Firebase» در برنامه‌تان ادغام کنید تا جریان ورود به سیستم سرتاسری را انجام دهید. ازآنجایی‌که این جریان به استفاده از کیت‌های توسعه نرم‌افزار Firebase مبتنی بر تلفن نیاز دارد، فقط در پلاتفرم‌های Android و Apple پشتیبانی می‌شود.

قبل از شروع

  1. ‫Firebase را به پروژه C++‎ خود اضافه کنید.
  2. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
  3. در زبانه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم Yahoo را فعال کنید.
  4. شناسه کارخواه و رمز کارخواه را از کنسول توسعه‌دهنده آن ارائه‌دهنده به پیکربندی ارائه‌دهنده اضافه کنید:
    1. برای ثبت کارخواه Yahoo OAuth، مستندات توسعه‌دهنده Yahoo را درباره ثبت برنامه وب با Yahoo دنبال کنید.

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

    2. هنگام ثبت برنامه‌ها با این ارائه‌دهندگان، حتماً دامنه *.firebaseapp.com را برای پروژه خود به‌عنوان دامنه هدایت مجدد برای برنامه خود ثبت کنید.
  5. روی ذخیره کردن کلیک کنید.

دسترسی به کلاس firebase::auth::Auth

کلاس Auth دروازه همه فراخوانی‌های API است.
  1. فایل‌های سرصفحه Auth و App را اضافه کنید:
    #include <cassert>
    #include <cstdint>
    
    #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»

برای مدیریت جریان ورود به سیستم با «کیت توسعه نرم‌افزار 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 APIs دارد، باید در اجازه‌های API در کنسول توسعه‌دهندگان Yahoo، اجازه‌های Yahoo APIs را درخواست کنید. محدوده‌های 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");
    

    برای کسب اطلاعات بیشتر، به مستندات محدوده‌های 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. اگرچه مثال‌های بالا بر جریان‌های ورود به سیستم تمرکز دارند، شما همچنین می‌توانید بااستفاده از LinkWithProvider ارائه‌دهنده Yahoo را به کاربر موجود پیوند دهید. برای مثال، می‌توانید چندین ارائه‌دهنده را به یک کاربر پیوند دهید و به او اجازه دهید با هرکدام از آن‌ها وارد سیستم شود.

    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 شیء دریافت کنید:

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