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

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

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

قبل از شروع

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

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

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

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

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

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

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

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

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

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

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

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

  1. در Xcode، اعلان‌های لحظه‌ای را برای پروژه‌تان فعال کنید.
  2. گواهینامه APNs خود را در Firebase بارگذاری کنید. اگر ازقبل گواهینامه APNs ندارید، حتماً در مرکز اعضای توسعه‌دهندگان Apple گواهینامه‌ای ایجاد کنید.

    1. در کنسول Firebase، به تنظیمات > کلی بروید. سپس، روی زبانه «پیام‌رسانی ابری» کلیک کنید.
    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 تماس می‌گیرید، Firebase،
    • (در iOS)، اعلان لحظه‌ای بی‌صدایی به برنامه شما ارسال می‌کند.
    • ‫Firebase پیامکی حاوی کد اصالت‌سنجی به شماره تلفن مشخص‌شده ارسال می‌کند و شناسه درستی‌سنجی را به تابع تکمیل شما منتقل می‌کند. برای ورود به سیستم کاربر، به کد درستی‌سنجی و شناسه درستی‌سنجی نیاز دارید.
  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;
    }
  • در Firebase Realtime Database و Cloud Storage قوانین امنیتی، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

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

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

auth.SignOut();