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

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

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

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

  1. قبل از اینکه بتوانید از Firebase Authentication استفاده کنید، باید Firebase Unity SDK (به طور خاص FirebaseAuth.unitypackage ) را به پروژه Unity خود اضافه کنید.

    دستورالعمل های دقیق برای این مراحل اولیه راه اندازی را در افزودن Firebase به پروژه Unity خود بیابید.

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

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

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

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

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

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

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

سهمیه درخواست ورود به سیستم شماره تلفن Firebase به اندازه‌ای زیاد است که بیشتر برنامه‌ها تحت تأثیر قرار نخواهند گرفت. با این حال، اگر نیاز به ورود تعداد بسیار زیادی از کاربران با احراز هویت تلفن دارید، ممکن است لازم باشد طرح قیمت گذاری خود را ارتقا دهید. صفحه قیمت را ببینید.

شروع دریافت اعلان‌های APN (فقط iOS)

برای استفاده از احراز هویت شماره تلفن در iOS، برنامه شما باید بتواند اعلان‌های 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 تماس بگیرید و PhoneAuthOptions حاوی شماره تلفن کاربر را به آن ارسال کنید.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) => {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) => {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    
    وقتی با PhoneAuthProvider.VerifyPhoneNumber ، Firebase تماس می گیرید،
    • (در iOS)، یک اعلان فشار بی صدا به برنامه شما ارسال می کند.
    • Firebase یک پیام کوتاه حاوی یک کد احراز هویت به شماره تلفن مشخص شده ارسال می کند و یک شناسه تأیید را به عملکرد تکمیل شما ارسال می کند. برای ورود کاربر به کد تأیید و شناسه تأیید نیاز دارید.
  3. شناسه تأیید را ذخیره کنید و زمانی که برنامه شما بارگیری شد، آن را بازیابی کنید. با انجام این کار، می‌توانید اطمینان حاصل کنید که اگر برنامه شما قبل از تکمیل جریان ورود به سیستم (به عنوان مثال، در حین جابجایی به برنامه پیامک) برنامه شما خاتمه یابد، همچنان یک شناسه تأیید معتبر دارید.

    شما می توانید شناسه تأیید را هر طور که می خواهید حفظ کنید. یک راه ساده این است که شناسه تأیید را با UnityEngine.PlayerPrefs ذخیره کنید.

اگر پاسخ تماس ارسال شده به codeSent فراخوانی شود، می‌توانید از کاربر بخواهید که کد تأیید را هنگام دریافت آن در پیام کوتاه تایپ کند.

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

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

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

  1. کد تایید را از کاربر دریافت کنید.
  2. از کد تأیید و شناسه تأیید یک شی Credential ایجاد کنید.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. کاربر را با شی PhoneAuthCredential وارد کنید:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });
    

مراحل بعدی

پس از اینکه کاربر برای اولین بار وارد سیستم شد، یک حساب کاربری جدید ایجاد می‌شود و به اعتبارنامه‌ها (یعنی نام کاربری و رمز عبور، شماره تلفن یا اطلاعات ارائه‌دهنده تاییدیه) مرتبط می‌شود که کاربر با آن وارد شده است. این حساب جدید به‌عنوان بخشی از پروژه Firebase شما ذخیره می‌شود و می‌توان از آن برای شناسایی کاربر در همه برنامه‌های پروژه شما، صرف نظر از نحوه ورود کاربر به سیستم استفاده کرد.

  • در برنامه های خود، می توانید اطلاعات اولیه نمایه کاربر را از شی Firebase.Auth.FirebaseUser دریافت کنید:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • در قوانین امنیتی Firebase Realtime Database و Cloud Storage خود، می‌توانید شناسه کاربری منحصر به فرد کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن دسترسی داشته باشد استفاده کنید.

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

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

auth.SignOut();