احراز هویت با Firebase با استفاده از یک سیستم احراز هویت سفارشی و C++

شما می‌توانید Firebase Authentication با یک سیستم احراز هویت سفارشی ادغام کنید، به این صورت که سرور احراز هویت خود را طوری تغییر دهید که وقتی کاربر با موفقیت وارد سیستم می‌شود، توکن‌های امضا شده سفارشی تولید کند. برنامه شما این توکن را دریافت کرده و از آن برای احراز هویت با فایربیس استفاده می‌کند.

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

  1. فایربیس را به پروژه ++C خود اضافه کنید .
  2. کلیدهای سرور پروژه خود را دریافت کنید:
    1. در کنسول Firebase ، به مسیر زیر بروید: > برگه حساب‌های سرویس .
    2. در پایین بخش Firebase Admin SDK ، روی «ایجاد کلید خصوصی جدید» کلیک کنید.
    3. جفت کلید عمومی/خصوصی حساب سرویس جدید به طور خودکار در رایانه شما ذخیره می‌شود. این فایل را در سرور احراز هویت خود کپی کنید.

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

کلاس 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);
تابع Auth::SignInWithCustomToken با توکنی که از سرور احراز هویت شما دریافت شده است، فراخوانی کنید.
  1. وقتی کاربران وارد برنامه شما می‌شوند، اطلاعات ورود آنها (مثلاً نام کاربری و رمز عبور) را به سرور احراز هویت شما ارسال می‌کنند. سرور شما اطلاعات را بررسی می‌کند و در صورت معتبر بودن، یک توکن سفارشی برمی‌گرداند.
  2. پس از دریافت توکن سفارشی از سرور احراز هویت خود، آن را به Auth::SignInWithCustomToken ارسال کنید تا کاربر وارد سیستم شود:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomToken(custom_token);
  3. اگر برنامه شما یک حلقه به‌روزرسانی دارد که مرتباً اجرا می‌شود (مثلاً 30 یا 60 بار در ثانیه)، می‌توانید نتایج را یک بار در هر به‌روزرسانی با Auth::SignInWithCustomTokenLastResult بررسی کنید:
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInWithCustomTokenLastResult();
    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 ثبت کنید .

مراحل بعدی

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