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

شما می‌توانید با ادغام ورود به سیستم گوگل در برنامه خود، به کاربران خود اجازه دهید تا با استفاده از حساب‌های گوگل خود در فایربیس احراز هویت کنند.

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

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

به کلاس 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);

احراز هویت با فایربیس

  1. برای دریافت شناسه ورود به سیستم گوگل، دستورالعمل‌های مربوط به اندروید و iOS+ را دنبال کنید.
  2. پس از اینکه کاربر با موفقیت وارد سیستم شد، توکن شناسه را با یک اعتبارنامه 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());
      }
    }
    یا اگر برنامه شما رویداد محور است، ممکن است ترجیح دهید یک فراخوانی مجدد در Future ثبت کنید .

ثبت تماس مجدد در Future

برخی برنامه‌ها توابع 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 دریافت کنید:

    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();
    }
  • در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، می‌توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آنها دسترسی داشته باشد، استفاده کنید.

شما می‌توانید با پیوند دادن اعتبارنامه‌های ارائه‌دهنده‌ی احراز هویت به یک حساب کاربری موجود، به کاربران اجازه دهید با استفاده از چندین ارائه‌دهنده‌ی احراز هویت به برنامه‌ی شما وارد شوند.

برای خروج کاربر، تابع SignOut() فراخوانی کنید:

auth->SignOut();