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

شما می توانید از Firebase Authentication برای ورود کاربر با ارسال پیامک به تلفن کاربر استفاده کنید. کاربر با استفاده از کد یکبار مصرف موجود در پیام اس ام اس وارد سیستم می شود.

این سند نحوه پیاده‌سازی جریان ورود به سیستم شماره تلفن را با استفاده از Firebase SDK توضیح می‌دهد.

قبل از شروع

  1. Firebase را به پروژه C++ خود اضافه کنید .
  2. اگر هنوز برنامه خود را به پروژه Firebase متصل نکرده اید، این کار را از کنسول Firebase انجام دهید.
  3. درک شرایط پلت فرم برای ورود به سیستم شماره تلفن:
    • ورود به سیستم با شماره تلفن فقط برای سیستم عامل های تلفن همراه است.
    • در iOS، ورود با شماره تلفن به یک دستگاه فیزیکی نیاز دارد و روی شبیه‌ساز کار نمی‌کند.

نگرانی های امنیتی

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

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

ورود به سیستم شماره تلفن را برای پروژه Firebase خود فعال کنید

برای ورود کاربران از طریق پیامک، ابتدا باید روش ورود شماره تلفن را برای پروژه Firebase خود فعال کنید:

  1. در کنسول Firebase ، بخش Authentication را باز کنید.
  2. در صفحه Sign-in Method ، روش ورود شماره تلفن را فعال کنید.

شروع دریافت اعلان‌های APN (پلتفرم‌های اپل)

برای استفاده از احراز هویت شماره تلفن در پلتفرم‌های اپل، برنامه شما باید بتواند اعلان‌های APN را از Firebase دریافت کند. هنگامی که کاربر را برای اولین بار با شماره تلفن او در دستگاهی وارد می‌کنید، Firebase Authentication یک اعلان فشار بی‌صدا به دستگاه ارسال می‌کند تا تأیید کند که درخواست ورود به سیستم شماره تلفن از برنامه شما می‌آید. (به همین دلیل، ورود به سیستم شماره تلفن را نمی توان در شبیه ساز استفاده کرد.)

برای فعال کردن اعلان‌های APN برای استفاده با Firebase Authentication :

  1. در Xcode، اعلان‌های فشاری را برای پروژه خود فعال کنید .
  2. گواهینامه APN خود را در Firebase آپلود کنید. اگر قبلاً گواهینامه APN ندارید، مطمئن شوید که در مرکز اعضای برنامه‌نویس Apple ایجاد کرده‌اید.

    1. در داخل پروژه خود در کنسول Firebase ، نماد چرخ دنده را انتخاب کنید، تنظیمات پروژه را انتخاب کنید و سپس برگه Cloud Messaging را انتخاب کنید.

    2. دکمه آپلود گواهی را برای گواهی توسعه، گواهی تولید یا هر دو انتخاب کنید. حداقل یکی مورد نیاز است.

    3. برای هر گواهی، فایل .p12 را انتخاب کنید و در صورت وجود رمز عبور را وارد کنید. مطمئن شوید که شناسه بسته این گواهی با شناسه بسته برنامه شما مطابقت دارد. ذخیره را انتخاب کنید.

یک کد تأیید را به تلفن کاربر ارسال کنید

برای شروع ورود به شماره تلفن، رابط کاربری را به کاربر ارائه دهید که از او می‌خواهد شماره تلفن خود را ارائه کند، و سپس با PhoneAuthProvider::VerifyPhoneNumber تماس بگیرید تا از Firebase بخواهید یک کد احراز هویت را از طریق پیامک به تلفن کاربر ارسال کند:

  1. شماره تلفن کاربر را دریافت کنید.

    الزامات قانونی متفاوت است، اما به عنوان بهترین روش و برای تعیین انتظارات برای کاربران خود، باید به آنها اطلاع دهید که در صورت استفاده از ورود به سیستم تلفنی، ممکن است پیامکی برای تأیید دریافت کنند و نرخ های استاندارد اعمال شود.

  2. با PhoneAuthProvider::VerifyPhoneNumber تماس بگیرید و شماره تلفن کاربر را به آن ارسال کنید.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(PhoneAuthCredential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuhtOptions options;
    options.timeout_milliseconds = kAutoVerifyTimeOut;
    options.phone_number = phone_number;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(options, &phone_listener);
    وقتی با PhoneAuthProvider::VerifyPhoneNumber ، Firebase تماس می گیرید،
    • (در iOS) یک اعلان فشار بی صدا به برنامه شما ارسال می کند،
    • یک پیام کوتاه حاوی یک کد احراز هویت به شماره تلفن مشخص شده ارسال می کند و یک شناسه تأیید را به عملکرد تکمیل شما ارسال می کند. برای ورود کاربر به کد تأیید و شناسه تأیید نیاز دارید.
  3. شناسه تأیید را ذخیره کنید و زمانی که برنامه شما بارگیری شد، آن را بازیابی کنید. با انجام این کار، می‌توانید اطمینان حاصل کنید که اگر برنامه شما قبل از تکمیل جریان ورود به سیستم (به عنوان مثال، در حین جابجایی به برنامه پیامک) برنامه شما خاتمه یابد، همچنان یک شناسه تأیید معتبر دارید.

    شما می توانید شناسه تأیید را هر طور که می خواهید حفظ کنید. اگر با یک چارچوب C++ چند پلتفرمی می‌نویسید، باید اعلان‌هایی برای خاتمه و بازیابی برنامه ارائه کند. در این رویدادها، می‌توانید شناسه تأیید را به ترتیب ذخیره و بازیابی کنید.

اگر تماس با VerifyPhoneNumber منجر به فراخوانی OnCodeSent در شنونده شما شود، می توانید از کاربر بخواهید که کد تأیید را هنگام دریافت آن در پیام اس ام اس تایپ کند.

از سوی دیگر، اگر تماس با VerifyPhoneNumber منجر به OnVerificationCompleted شود، تأیید خودکار با موفقیت انجام شده است و اکنون یک PhoneAuthCredential خواهید داشت که می توانید با استفاده از آن همانطور که در زیر توضیح داده شده است استفاده کنید.

کاربر را با کد تایید وارد کنید

پس از اینکه کاربر کد تأیید را از پیام SMS به برنامه شما ارائه کرد، با ایجاد یک شی PhoneAuthCredential از کد تأیید و شناسه تأیید و ارسال آن شی به Auth::SignInWithCredential ، کاربر را وارد سیستم کنید.

  1. کد تایید را از کاربر دریافت کنید.
  2. از کد تأیید و شناسه تأیید یک شی Credential ایجاد کنید.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. کاربر را با شی Credential وارد کنید:
    Future<User> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            User user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user.phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user.uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user.provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);

مراحل بعدی

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