אימות ב-Unity באמצעות Google Play Games Services

אפשר להשתמש ב-Google Play Games Services כדי להכניס שחקנים למשחק ל-Android שמבוססים על Firebase ו-Unity. כדי להשתמש בכניסה לשירותי Google Play Games באמצעות Firebase, קודם צריך להיכנס לחשבון של השחקן באמצעות Google Play Games ולבקש קוד אימות מסוג OAuth 2.0. לאחר מכן, מעבירים את קוד האימות אל PlayGamesAuthProvider כדי ליצור פרטי כניסה ל-Firebase, שאפשר להשתמש בהם כדי לבצע אימות באמצעות Firebase.

לפני שמתחילים

הגדרת הפרויקט ב-Unity

  1. מוסיפים את קובץ התצורה של Firebase ואת ה-SDK מסוג Firebase Unity לפרויקט ב-Unity כפי שמתואר מוסיפים את Firebase לפרויקט Unity. פועלים לפי ההוראות ל-Android.

    חשוב לייבא את FirebaseAuth.unitypackage.

  2. בעורך Unity, בקטע Build Settings (הגדרות build)‏ > Player Settings (הגדרות נגן)‏ > Other Settings (הגדרות אחרות), מגדירים את שם החבילה של המשחק ל-Android.

  3. לאחר מכן, בקטע בניית הגדרות > הגדרות הנגן > הגדרות פרסום, בחירה או יצירה של מאגר מפתחות ומפתח, שישמשו לחתימה על מכשיר ה-Android חבילה. חבילת ה-APK צריכה להיות חתומה כדי שהכניסה ל-Play Games תפעל. הדרישה הזו חלה לא רק על פרסום המשחק, אלא גם במהלך הפיתוח שלו.

הגדרת פרויקט Firebase

  1. במסוף Firebase, נכנסים לפרויקט Firebase רשמתם את הפרויקט ב-Unity.

  2. מגדירים את טביעת האצבע של המשחק ב-SHA-1 בדף Settings במסוף Firebase, באמצעות המפתח שהגדרתם ב-Unity.

    אפשר לקבל את טביעת האצבע SHA-1 של המפתח באמצעות הפקודה keytool:

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

    לחלופין, אפשר לקבל את ה-SHA hash של אישור החתימה באמצעות הפקודה ggle signingReport:

    gradlew signingReport

    ה-APK חייב להיות חתום באמצעות המפתח הזה, גם בזמן הפיתוח.

  3. הפעלת Google Play Games כספק כניסה:

    1. במסוף Firebase, פותחים את Authentication.

    2. יוצרים ומקבלים את מזהה הלקוח ואת הסוד של שרת האינטרנט של הפרויקט:

      1. בכרטיסייה שיטת כניסה, מפעילים את פרטי הכניסה של Google. ספק.

      2. מעתיקים את הסוד ומזהה הלקוח של שרת האינטרנט מהכניסה של Google. ספק.

    3. בכרטיסייה שיטת כניסה, מפעילים את האפשרות Play Games. ספק הכניסה, ולציין את מזהה הלקוח של שרת האינטרנט של הפרויקט סוד לקוח, שקיבלתם בשלב האחרון.

הגדרת Play Games services עם פרטי האפליקציה ב-Firebase

  1. ב מסוף Google Play, אפשר לפתוח את אפליקציית Google Play או ליצור אפליקציה חדשה.

  2. בקטע צמיחה לוחצים על Play Games services > הגדרה ו ניהול > הגדרה.

  3. לוחצים על כן, המשחק שלי כבר משתמש ב-Google APIs ובוחרים את Firebase בפרויקט מהרשימה ואז לוחצים על Use.

  4. בדף ההגדרות האישיות של Play Games services, לוחצים על Add Credential (הוספת פרטי כניסה)

    1. בוחרים את הסוג שרת משחקים.
    2. בשדה לקוח OAuth, בוחרים את מזהה לקוח האינטרנט של הפרויקט. להיות זהו אותו מזהה לקוח שציינתם כשהפעלתם את כניסה של Play Games.
    3. שומרים את השינויים.
  5. עדיין בדף ההגדרה של Play Games services, לוחצים על Add Credential (הוספת פרטי כניסה).

    1. בוחרים בסוג Android.
    2. בשדה OAuth client, בוחרים את מזהה הלקוח של הפרויקט ב-Android. (אם מזהה הלקוח של Android לא מופיע, חשוב לוודא שהגדרתם את טביעת האצבע SHA-1 של המשחק במסוף Firebase).
    3. שומרים את השינויים.
  6. בדפים אירועים, הישגים ולוחות לידרבורד, יוצרים Play Games משאבים שברצונך להשתמש בהם במשחק (אם לא אם רוצים להשתמש בו באופן מיידי, אפשר ליצור רשומת placeholder). לאחר מכן, מפעילים בכל אחד מהדפים אירועים, הישגים או לוחות לידרבורד, לוחצים קבלת מקורות מידע והעתקה של קטע הקוד של משאבי 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. בדף Testers, מוסיפים את כתובות האימייל של כל המשתמשים שצריכים להיכנס למשחק לפני שתוציאו אותו ל-Play Store.

שילוב הכניסה ל-Play Games במשחק

  1. הורדת הגרסה האחרונה של פלאגין של Play Games ל-Unity ומחלצים אותו.

  2. מייבאים את חבילת Unity של הפלאגין לפרויקט ב-Unity. אפשר למצוא חבילת Unity בספרייה current-build של ארכיון הגרסאות.

  3. מגדירים את הפלאגין של Play Games:

    1. לוחצים על חלון > Google Play Games > הגדרה > הגדרת Android כדי לפתוח את המסך הגדרת Android.
    2. מדביקים את קטע הקוד של משאבי Android שקיבלתם מ-Play Console לתוך השדה Resource Definition.
    3. מדביקים את מזהה הלקוח של שרת האינטרנט, שסיפקתם כשהפעלתם את ההתחברות ל-Play Games במסוף Firebase, בשדה Client ID.
    4. לוחצים על Setup (הגדרה).
  4. במשחק שלך, צריך להגדיר לקוח של Play Games באמצעות 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 Games, מבצעים שיחה Social.localUser.Authenticate():

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

אימות באמצעות Firebase

אחרי שמוסיפים את הכניסה ל-Play Games למשחק, אפשר להשתמש בקוד ההרשאה של Play Games Services לאימות באמצעות Firebase.

  1. אחרי שהשחקן נכנס לחשבון באמצעות Play Games, כניסה לחשבון handler המשך, קבלת קוד הרשאה לחשבון השחקן:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. לאחר מכן, צריך להחליף את קוד ההרשאה מ-Play Games Services ב-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 Games. החשבון החדש הזה מאוחסן כחלק מפרויקט 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 וכללי אבטחה של Cloud Storage, אפשר לקבל מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.

כדי לקבל את פרטי הנגן של המשתמש ב-Play Games או כדי לגשת לשירותי Play Games: להשתמש בממשקי ה-API שסופקו על ידי הפלאגין של Play Games.

כדי להוציא משתמש, קוראים לפונקציה SignOut():

auth.SignOut();