ตรวจสอบสิทธิ์ใน Unity โดยใช้บริการเกมของ Google Play

คุณสามารถใช้บริการเกมของ Google Play เพื่อลงชื่อเข้าใช้เกม Android ที่สร้างขึ้นใน Firebase และ Unity ให้ผู้เล่นได้ หากต้องการใช้การลงชื่อเข้าใช้บริการเกมของ Google Play ด้วย Firebase ให้ลงชื่อเข้าใช้ผู้เล่นด้วยบริการเกมของ Google Play ก่อน แล้วขอรหัสการให้สิทธิ์ OAuth 2.0 เมื่อดำเนินการดังกล่าว จากนั้นส่งรหัสการให้สิทธิ์ไปยัง PlayGamesAuthProvider เพื่อสร้างข้อมูลเข้าสู่ระบบ Firebase ซึ่งคุณสามารถใช้เพื่อตรวจสอบสิทธิ์กับ Firebase ได้

ก่อนเริ่มต้น

ตั้งค่าโปรเจ็กต์ Unity

  1. เพิ่มไฟล์การกำหนดค่า Firebase และ Firebase Unity SDK ลงในโปรเจ็กต์ Unity ตามที่อธิบายไว้ใน เพิ่ม Firebase ลงในโปรเจ็กต์ Unity ทำตามวิธีการสำหรับ Android

    ตรวจสอบว่าได้นำเข้า FirebaseAuth.unitypackage แล้ว

  2. ใน Unity Editor ให้ตั้งชื่อแพ็กเกจ Android ของเกมในส่วนการตั้งค่าบิลด์ > การตั้งค่าผู้เล่น > การตั้งค่าอื่นๆ

  3. จากนั้นในส่วนการตั้งค่าการสร้าง > การตั้งค่าผู้เล่น > การตั้งค่าการเผยแพร่ ให้เลือกหรือสร้างคีย์สโตร์และคีย์ที่จะใช้ลงชื่อแพ็กเกจ Android คุณต้องลงชื่อ APK เพื่อให้การลงชื่อเข้าใช้บริการเกมของ Play ทำงานได้ ข้อกำหนดนี้ไม่เพียงใช้กับการเผยแพร่เท่านั้น แต่ยังใช้ในระหว่างการพัฒนาเกมด้วย

ตั้งค่าโปรเจ็กต์ Firebase

  1. ใน Firebase คอนโซล ให้ไปที่โปรเจ็กต์ Firebase ที่คุณลงทะเบียนโปรเจ็กต์ Unity ไว้

  2. ระบุลายนิ้วมือ SHA-1 ของเกม

    1. ในคอนโซล Firebase ให้ไปที่ Settings > General แท็บ

    2. เลื่อนลงไปที่การ์ด Your apps เลือกแอป Android แล้วเพิ่มลายนิ้วมือ SHA-1 ในช่อง SHA certificate fingerprints

    คุณสามารถรับลายนิ้วมือ SHA-1 ของคีย์ได้ด้วยคำสั่ง keytool ดังนี้

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

    หรือจะรับแฮช SHA ของใบรับรองที่ลงนามด้วยคำสั่ง signingReport ของ Gradle ก็ได้

    gradlew signingReport

    ดูรายละเอียดเกี่ยวกับวิธีรับลายนิ้วมือ SHA ของแอปได้ที่หัวข้อการตรวจสอบสิทธิ์ไคลเอ็นต์

    คุณต้องลงชื่อ APK ด้วยคีย์นี้ รวมถึงในระหว่างการพัฒนา

  3. เปิดใช้ Google Play Games เป็นผู้ให้บริการลงชื่อเข้าใช้โดยทำดังนี้

    1. ในคอนโซล Firebase ให้ไปที่Security > Authentication

    2. สร้างและรับรหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์ของเว็บเซิร์ฟเวอร์ของโปรเจ็กต์โดยทำดังนี้

      1. ในแท็บSign-in method ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ 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 Games สำหรับ Unity รุ่นล่าสุด แล้วแตกไฟล์

  2. นำเข้าแพ็กเกจ Unity ของปลั๊กอินลงในโปรเจ็กต์ Unity คุณจะพบแพ็กเกจ Unity ในไดเรกทอรี current-build ของไฟล์เก็บถาวรรุ่นที่เผยแพร่

  3. ตั้งค่าปลั๊กอิน Play Games โดยทำดังนี้

    1. คลิกWindow > Google Play Games > Setup > Android Setup เพื่อเปิดหน้าจอการกำหนดค่า Android
    2. วางข้อมูลโค้ดทรัพยากร Android ที่ได้รับจาก Play Console ลงในช่องResources Definition
    3. วางรหัสไคลเอ็นต์เว็บเซิร์ฟเวอร์ที่คุณระบุเมื่อเปิดใช้การลงชื่อเข้าใช้ Play Games ใน Firebase คอนโซล ลงในช่อง Client ID
    4. คลิกSetup
  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 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 ให้ใช้ API ที่ปลั๊กอิน Play Games มีให้

หากต้องการออกจากระบบผู้ใช้ ให้เรียก SignOut() ดังนี้

auth.SignOut();