اصالت‌سنجی در Unity بااستفاده از «خدمات بازی‌های Google Play»

می‌توانید از سرویس‌های «بازی‌های Google Play» برای ورود به سیستم بازیکنان در بازی Android که در Firebase و Unity ساخته شده است استفاده کنید. برای استفاده از ورود به سیستم «سرویس‌های بازی‌های Google Play» با Firebase، ابتدا با «سرویس‌های بازی‌های Google Play» به سیستم بازیکن وارد شوید و وقتی این کار را انجام می‌دهید، کد اصالت‌سنجی OAuth 2.0 را درخواست کنید. سپس، کد اصالت‌سنجی را به PlayGamesAuthProvider ارسال کنید تا اطلاعات اعتباری Firebase تولید کند، که می‌توانید از آن برای اصالت‌سنجی با Firebase استفاده کنید.

قبل از شروع

راه‌اندازی پروژه Unity

  1. فایل پیکربندی Firebase و کیت توسعه نرم‌افزار Firebase Unity را به پروژه Unity خود اضافه کنید همان‌طور که در افزودن Firebase به پروژه Unity توضیح داده شده است. دستورالعمل‌های Android را دنبال کنید.

    حتماً FirebaseAuth.unitypackage را وارد کنید.

  2. در «ویرایشگر Unity»، در بخش تنظیمات ساخت > تنظیمات پخش‌کننده > تنظیمات دیگر نام بسته Android بازی‌تان را تنظیم کنید.

  3. سپس، در بخش تنظیمات ساخت > تنظیمات پخش‌کننده > تنظیمات انتشار، انبار کلید و کلیدی را انتخاب یا ایجاد کنید که برای امضای بسته Android شما استفاده خواهد شد. برای اینکه ورود به سیستم «بازی‌های Play» کار کند، باید APK شما امضا شده باشد—این شرط نه تنها برای انتشار، بلکه درطول توسعه بازی شما نیز اعمال می‌شود.

راه‌اندازی پروژه Firebase

  1. در کنسول Firebase، به پروژه Firebase بروید که پروژه Unity خود را در آن ثبت کرده‌اید.

  2. اثر انگشت SHA-1 بازی‌تان را مشخص کنید.

    1. در کنسول Firebase، به تنظیمات > زبانه کلی بروید.

    2. به کارت برنامه‌های شما پیمایش کنید، برنامه Android خود را انتخاب کنید، و اثر انگشت SHA-1 خود را در فیلد اثر انگشت‌های گواهینامه SHA اضافه کنید.

    می‌توانید اثر انگشت SHA-1 کلیدتان را با فرمان keytool دریافت کنید:

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

    یا می‌توانید مقدار درهم‌سازی SHA گواهینامه امضایتان را با فرمان gradle signingReport دریافت کنید:

    gradlew signingReport

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

    ‫APK شما باید با این کلید امضا شود، حتی درطول توسعه.

  3. ‫Google Play Games را به‌عنوان ارائه‌دهنده ورود به سیستم فعال کنید:

    1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.

    2. شناسه کارخواه سرور وب پروژه و رمز کارخواه خود را تولید و دریافت کنید:

      1. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم Google را فعال کنید.

      2. شناسه کارخواه سرور وب و رمز را از ارائه‌دهنده ورود به سیستم Google کپی کنید.

    3. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم Play Games را فعال کنید و شناسه کارخواه سرور وب پروژه و رمز کارخواه را که در مرحله آخر دریافت کردید مشخص کنید.

‫Play Games services را با اطلاعات برنامه Firebase پیکربندی کنید

  1. در Google Play Console، برنامه Google Play را باز کنید یا برنامه‌ای ایجاد کنید.

  2. در بخش رشد، روی Play Games services > راه‌اندازی و مدیریت > پیکربندی کلیک کنید.

  3. روی بله، بازی من ازقبل از Google APIs استفاده می‌کند کلیک کنید، پروژه Firebase خود را از فهرست انتخاب کنید، و سپس روی استفاده کردن کلیک کنید.

  4. در صفحه پیکربندی Play Games services، روی افزودن اطلاعات اعتباری کلیک کنید.

    1. نوع سرور بازی را انتخاب کنید.
    2. در فیلد کارخواه OAuth، شناسه کارخواه وب پروژه‌تان را انتخاب کنید. مطمئن شوید این همان شناسه کلاینتی است که هنگام فعال کردن ورود به سیستم Play Games مشخص کرده‌اید.
    3. تغییرات خود را ذخیره کنید.
  5. همچنان در صفحه پیکربندی Play Games services، دوباره روی افزودن اطلاعات اعتباری کلیک کنید.

    1. نوع Android را انتخاب کنید.
    2. در فیلد کارخواه OAuth، شناسه کارخواه Android پروژه‌تان را انتخاب کنید. (اگر شناسه مشتری Android خود را نمی‌بینید، مطمئن شوید که اثر انگشت SHA-1 بازی خود را در کنسول Firebase تنظیم کرده‌اید.)
    3. تغییرات خود را ذخیره کنید.
  6. در صفحه‌های رویدادها، جایزه‌ها، و تابلوهای امتیازات، هر Play Games منبعی را که می‌خواهید با بازی‌تان استفاده کنید ایجاد کنید (اگر نمی‌خواهید بلافاصله از منبعی استفاده کنید، می‌توانید ورودی جای‌بان ایجاد کنید). سپس در هریک از صفحه‌های رویدادها، جوایز، یا جدول‌های رده‌بندی، روی دریافت منابع کلیک کنید و گزیده منابع Android را در جایی مناسب کپی کنید. برای راه‌اندازی افزایه Google Play Games services به این گزیده نیاز دارید.

    گزیده منابع شبیه مثال زیر است:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    Google Play game services IDs.
    Save this file as res/values/games-ids.xml in your project.
    -->
    <resources>
      <!-- app_id -->
      <string name="app_id" translatable="false">123456789000</string>
      <!-- package_name -->
      <string name="package_name" translatable="false">com.example.game</string>
      <!-- event Wiped Raid -->
      <string name="event_wiped_raid" translatable="false">CgkIpKjv1a4PEAIYBA</string>
    </resources>
    
  7. در صفحه آزمایشگران، نشانی‌های ایمیل کاربرانی را که باید بتوانند قبل‌از انتشار بازی‌تان در Play Store به سیستم وارد شوند اضافه کنید.

ادغام کردن ورود به سیستم «بازی‌های Play» در بازی

  1. جدیدترین نسخه پخش افزایه «بازی‌های Play» برای Unity را بارگیری کنید و آن را استخراج کنید.

  2. بسته Unity افزایه را به پروژه Unity خود وارد کنید. بسته Unity را می‌توانید در دایرکتوری current-build بایگانی نسخه پخش پیدا کنید.

  3. راه‌اندازی افزایه «بازی‌های Play»:

    1. برای باز کردن صفحه پیکربندی Android، روی پنجره > بازی‌های Google Play > راه‌اندازی > راه‌اندازی Android کلیک کنید.
    2. تکه‌کد منابع Android را که از «کنسول Play» دریافت کرده‌اید در فیلد تعریف منابع جای‌گذاری کنید.
    3. شناسه کارخواه سرور وب را که هنگام فعال کردن ورود به سیستم «بازی‌های Play» در کنسول Firebase ارائه کردید، در فیلد شناسه کارخواه جای‌گذاری کنید.
    4. روی راه‌اندازی کلیک کنید.
  4. در بازی‌تان، کارخواه «بازی‌های Play» را با RequestServerAuthCode تنظیم فعال پیکربندی کنید:

    using GooglePlayGames;
    using GooglePlayGames.BasicApi;
    using UnityEngine.SocialPlatforms;
    using System.Threading.Tasks;
    
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        .RequestServerAuthCode(false /* Don't force refresh */)
        .Build();
    
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    
  5. سپس، وقتی بازیکنی انتخاب می‌کند که با «بازی‌های Play» به سیستم وارد شود، Social.localUser.Authenticate() را فراخوانی کنید:

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

اصالت‌سنجی با Firebase

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

  1. پس‌از اینکه بازیکن باموفقیت بااستفاده از «بازی‌های Play» به سیستم وارد شد، در مدیریت ادامه ورود به سیستم، کد اصالت‌سنجی حساب بازیکن را دریافت کنید:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. سپس، کد اصالت‌سنجی را از سرویس‌های بازی‌های Play با اطلاعات اعتباری Firebase مبادله کنید و از اطلاعات اعتباری Firebase برای اصالت‌سنجی بازیکن استفاده کنید:

    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    Firebase.Auth.Credential credential =
        Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

مراحل بعدی

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

در بازی‌تان، می‌توانید UID کاربر Firebase را از Firebase.Auth.FirebaseUser شیء دریافت کنید:

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null && user.IsValid()) {
  string playerName = user.DisplayName;

  // 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 دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

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

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

auth.SignOut();