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

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

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

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

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

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

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

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

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

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

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

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

  1. در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
  2. در صفحه روش ورود ، روش ورود با شماره تلفن را فعال کنید.
  3. در صفحه تنظیمات ، سیاستی را برای مناطقی که می‌خواهید ارسال پیامک به آنها مجاز یا غیرمجاز باشد، تنظیم کنید. برای پروژه‌های جدید، سیاست پیش‌فرض هیچ منطقه‌ای را مجاز نمی‌داند.

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

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

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

  1. در Xcode، اعلان‌های فوری (push notifications) را برای پروژه خود فعال کنید .
  2. گواهی APN خود را در Firebase آپلود کنید. اگر از قبل گواهی APN ندارید، حتماً آن را در مرکز اعضای توسعه‌دهنده اپل ایجاد کنید.

    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) =&gt {
        // 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) =&gt {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) =&gt {
        // 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) =&gt {
        // 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 را در فایربیس فراخوانی می‌کنید،
    • (در iOS)، یک اعلان بی‌صدا به برنامه شما ارسال می‌کند.
    • فایربیس یک پیامک حاوی کد احراز هویت به شماره تلفن مشخص شده ارسال می‌کند و یک شناسه تأیید را به تابع تکمیل شما ارسال می‌کند. برای ورود کاربر، به کد تأیید و شناسه تأیید نیاز خواهید داشت.
  3. شناسه تأیید را ذخیره کنید و هنگام بارگیری برنامه، آن را بازیابی کنید. با انجام این کار، می‌توانید مطمئن شوید که اگر برنامه شما قبل از تکمیل فرآیند ورود کاربر (مثلاً هنگام تغییر به برنامه پیامک) خاتمه یابد، هنوز شناسه تأیید معتبری دارید.

    شما می‌توانید شناسه تأیید را به هر روشی که می‌خواهید ذخیره کنید. یک راه ساده، ذخیره شناسه تأیید با UnityEngine.PlayerPrefs است.

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

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

کاربر با کد تأیید وارد سیستم شود

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

  1. کد تایید را از کاربر دریافت کنید.
  2. یک شیء Credential از کد تأیید و شناسه تأیید ایجاد کنید.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. کاربر را با شیء PhoneAuthCredential وارد سیستم کنید:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task =&gt {
      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;
    }
  • در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، می‌توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آنها دسترسی داشته باشد، استفاده کنید.

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

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

auth.SignOut();