با استفاده از Google Sign-In و C++ احراز هویت

می‌توانید با ادغام Google Sign-In در برنامه خود، به کاربران خود اجازه دهید با Firebase با استفاده از حساب‌های Google خود احراز هویت کنند.

قبل از اینکه شروع کنی

  1. Firebase را به پروژه C++ خود اضافه کنید .
  2. Google را به عنوان روش ورود به سیستم در کنسول Firebase فعال کنید:
    1. در کنسول Firebase ، بخش Auth را باز کنید.
    2. در برگه روش ورود به سیستم ، روش ورود به سیستم Google را فعال کنید و روی ذخیره کلیک کنید.
  3. هنگامی که در کنسول از شما خواسته شد، فایل پیکربندی Firebase به روز شده ( google-services.json ) را دانلود کنید، که اکنون حاوی اطلاعات سرویس گیرنده OAuth مورد نیاز برای ورود به سیستم Google است.
  4. این فایل پیکربندی به روز شده را به پروژه Android Studio خود منتقل کنید و جایگزین فایل پیکربندی متناظر منسوخ شده است. ( به افزودن Firebase به پروژه Android خود مراجعه کنید.)

دسترسی به 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 احراز هویت

  1. دستورالعمل‌های Android و iOS+ را دنبال کنید تا یک کد شناسه برای ورود به سیستم Google دریافت کنید.
  2. پس از اینکه کاربر با موفقیت وارد سیستم شد، کد ID را با اعتبار Firebase تعویض کنید و با Firebase با استفاده از اعتبار Firebase احراز هویت کنید:
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  3. اگر برنامه شما دارای یک حلقه به‌روزرسانی است که به طور منظم اجرا می‌شود (مثلاً 30 یا 60 بار در ثانیه)، می‌توانید نتایج را یک بار در هر به‌روزرسانی با Auth::SignInAndRetrieveDataWithCredentialLastResult :
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredentialLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::AuthResult auth_result = *result.result();
        printf("Sign in succeeded for `%s`\n",
               auth_result.user.display_name().c_str());
      } else {
        printf("Sign in failed with error '%s'\n", result.error_message());
      }
    }
    
    بررسی کنید یا اگر برنامه شما مبتنی بر رویداد است، ممکن است ترجیح دهید. برای ثبت تماس برگشتی در آینده .

ثبت پاسخ تماس در آینده

برخی از برنامه ها دارای توابع Update هستند که 30 یا 60 بار در ثانیه فراخوانی می شوند. به عنوان مثال، بسیاری از بازی ها از این مدل پیروی می کنند. این برنامه ها می توانند توابع LastResult را برای نظرسنجی تماس های ناهمزمان فراخوانی کنند. با این حال، اگر برنامه شما مبتنی بر رویداد است، ممکن است ترجیح دهید توابع پاسخ به تماس را ثبت کنید. یک تابع فراخوانی پس از اتمام Future فراخوانی می شود.
void OnCreateCallback(const firebase::Future<firebase::auth::User*>& result,
                      void* user_data) {
  // The callback is called when the Future enters the `complete` state.
  assert(result.status() == firebase::kFutureStatusComplete);

  // Use `user_data` to pass-in program context, if you like.
  MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data);

  // Important to handle both success and failure situations.
  if (result.error() == firebase::auth::kAuthErrorNone) {
    firebase::auth::User* user = *result.result();
    printf("Create user succeeded for email %s\n", user->email().c_str());

    // Perform other actions on User, if you like.
    firebase::auth::User::UserProfile profile;
    profile.display_name = program_context->display_name;
    user->UpdateUserProfile(profile);

  } else {
    printf("Created user failed with error '%s'\n", result.error_message());
  }
}

void CreateUser(firebase::auth::Auth* auth) {
  // Callbacks work the same for any firebase::Future.
  firebase::Future<firebase::auth::AuthResult> result =
      auth->CreateUserWithEmailAndPasswordLastResult();

  // `&my_program_context` is passed verbatim to OnCreateCallback().
  result.OnCompletion(OnCreateCallback, &my_program_context);
}
تابع callback نیز در صورت تمایل می تواند یک لامبدا باشد.
void CreateUserUsingLambda(firebase::auth::Auth* auth) {
  // Callbacks work the same for any firebase::Future.
  firebase::Future<firebase::auth::AuthResult> result =
      auth->CreateUserWithEmailAndPasswordLastResult();

  // The lambda has the same signature as the callback function.
  result.OnCompletion(
      [](const firebase::Future<firebase::auth::User*>& result,
         void* user_data) {
        // `user_data` is the same as &my_program_context, below.
        // Note that we can't capture this value in the [] because std::function
        // is not supported by our minimum compiler spec (which is pre C++11).
        MyProgramContext* program_context =
            static_cast<MyProgramContext*>(user_data);

        // Process create user result...
        (void)program_context;
      },
      &my_program_context);
}

مراحل بعدی

پس از اینکه کاربر برای اولین بار وارد سیستم شد، یک حساب کاربری جدید ایجاد می‌شود و به اعتبارنامه‌ها (یعنی نام کاربری و رمز عبور، شماره تلفن یا اطلاعات ارائه‌دهنده تاییدیه) مرتبط می‌شود که کاربر با آن وارد شده است. این حساب جدید به‌عنوان بخشی از پروژه 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();