چندین ارائه دهنده تأیید اعتبار را با استفاده از C++ به یک حساب پیوند دهید

شما می‌توانید با پیوند دادن اعتبارنامه‌های ارائه‌دهنده‌ی احراز هویت به یک حساب کاربری موجود، به کاربران اجازه دهید با استفاده از چندین ارائه‌دهنده‌ی احراز هویت به برنامه‌ی شما وارد شوند. کاربران صرف نظر از ارائه‌دهنده‌ی احراز هویتی که برای ورود به سیستم استفاده کرده‌اند، با همان شناسه‌ی کاربری Firebase قابل شناسایی هستند. به عنوان مثال، کاربری که با رمز عبور وارد سیستم شده است، می‌تواند یک حساب گوگل را پیوند دهد و در آینده با هر دو روش وارد سیستم شود. یا، یک کاربر ناشناس می‌تواند یک حساب فیس‌بوک را پیوند دهد و سپس، بعداً، برای ادامه‌ی استفاده از برنامه‌ی شما، با فیس‌بوک وارد سیستم شود.

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

پشتیبانی از دو یا چند ارائه‌دهنده‌ی احراز هویت (احتمالاً شامل احراز هویت ناشناس) را به برنامه‌ی خود اضافه کنید.

برای پیوند دادن اعتبارنامه‌های ارائه‌دهنده‌ی احراز هویت به یک حساب کاربری موجود:

  1. کاربر را با استفاده از هر ارائه دهنده یا روش احراز هویتی وارد سیستم کنید.
  2. روند ورود به سیستم برای ارائه‌دهنده‌ی احراز هویت جدید را تا فراخوانی یکی از متدهای firebase::auth::Auth::SignInWithCredential تکمیل کنید، اما این کار را شامل نمی‌شود. برای مثال، توکن شناسه‌ی گوگل کاربر، توکن دسترسی فیسبوک یا ایمیل و رمز عبور را دریافت کنید.
  3. یک firebase::auth::Credential برای ارائه‌دهنده احراز هویت جدید دریافت کنید:

    ورود به سیستم گوگل
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    ورود به فیسبوک
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    ورود با ایمیل و رمز عبور
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
  4. شیء firebase::auth::Credential را به متد LinkWithCredential کاربر وارد شده ارسال کنید:

    // Link the new credential to the currently active user.
    firebase::auth::User current_user = auth->current_user();
    firebase::Future<firebase::auth::AuthResult> result =
        current_user.LinkWithCredential(credential);

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

    // Gather data for the currently signed in User.
    firebase::auth::User current_user = auth->current_user();
    std::string current_email = current_user.email();
    std::string current_provider_id = current_user.provider_id();
    std::string current_display_name = current_user.display_name();
    std::string current_photo_url = current_user.photo_url();
    
    // Sign in with the new credentials.
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // The new User is now active.
    if (result.error() == firebase::auth::kAuthErrorNone) {
      firebase::auth::User* new_user = *result.result();
    
      // Merge new_user with the user in details.
      // ...
      (void)new_user;
    }

اگر فراخوانی LinkWithCredential با موفقیت انجام شود، کاربر اکنون می‌تواند با استفاده از هر ارائه‌دهنده احراز هویت لینک‌شده وارد سیستم شود و به همان داده‌های Firebase دسترسی پیدا کند.

یک حساب کاربری Firebase می‌تواند چندین ارائه‌دهنده‌ی احراز هویت (مثلاً ایمیل/رمز عبور، گوگل، فیس‌بوک) داشته باشد که به کاربر اجازه می‌دهد از طریق روش‌های مختلف به یک حساب Firebase وارد شود.

اگر ارتباط یک ارائه‌دهنده‌ی احراز هویت را با حساب کاربری قطع کنید، کاربر دیگر نمی‌تواند با آن ارائه‌دهنده وارد سیستم شود.

برای قطع ارتباط یک ارائه‌دهنده‌ی احراز هویت از یک حساب کاربری، شناسه‌ی ارائه‌دهنده را به متد Unlink ارسال کنید. می‌توانید شناسه‌های ارائه‌دهنده‌ی ارائه‌دهندگان احراز هویت مرتبط با یک کاربر را با فراخوانی ProviderData دریافت کنید.

// Unlink the sign-in provider from the currently active user.
firebase::auth::User current_user = auth->current_user();
firebase::Future<firebase::auth::AuthResult> result =
    current_user.Unlink(providerId);

عیب‌یابی

اگر هنگام تلاش برای پیوند دادن چندین حساب با خطا مواجه شدید، به مستندات مربوط به آدرس‌های ایمیل تأیید شده مراجعه کنید.