ตรวจสอบสิทธิ์โดยใช้ Google Sign-In และ Unity

คุณสามารถอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้บัญชี Google ของตนเองได้ด้วยการผสานรวม Google Sign-In เข้ากับแอป

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

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

คุณต้องทำสิ่งต่อไปนี้ก่อนจึงจะใช้ Firebase Authentication ได้

  • ลงทะเบียนโปรเจ็กต์ Unity และกำหนดค่าให้ใช้ Firebase

    • หากโปรเจ็กต์ Unity ใช้ Firebase อยู่แล้ว แสดงว่าโปรเจ็กต์ดังกล่าวลงทะเบียนและกำหนดค่าสำหรับ Firebase แล้ว

    • หากไม่มีโปรเจ็กต์ Unity คุณสามารถดาวน์โหลดแอปตัวอย่างได้

  • เพิ่ม Firebase Unity SDK (โดยเฉพาะ FirebaseAuth.unitypackage) ลงในโปรเจ็กต์ Unity

โปรดทราบว่าการเพิ่ม Firebase ลงในโปรเจ็กต์ Unity เกี่ยวข้องกับงานทั้งในคอนโซล Firebase และในโปรเจ็กต์ Unity ที่เปิดอยู่ (เช่น คุณดาวน์โหลดไฟล์การกำหนดค่า Firebase จากคอนโซล แล้วย้ายไฟล์เหล่านั้นไปยังโปรเจ็กต์ Unity)

ตั้งค่าโปรเจ็กต์ Firebase และข้อมูลเข้าสู่ระบบ

  1. Android: ระบุลายนิ้วมือ SHA-1 ของแอปในคอนโซล Firebase โดยทำดังนี้

    1. ในคอนโซล Firebase ให้ไปที่ การตั้งค่า > แท็บทั่วไป
    2. ไปที่การ์ดแอปของคุณ เลือกแอป Android แล้วเพิ่มลายนิ้วมือ SHA-1 ในช่องลายนิ้วมือของใบรับรอง SHA

      คุณสามารถดึงข้อมูลลายนิ้วมือ SHA-1 ของ Keystore ได้โดยใช้ keytool ดังนี้

      keytool -keystore path-to-keystore.keystore -list -v
      

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

  2. เปิดใช้ Google Sign-In และคัดลอกรหัสไคลเอ็นต์เว็บ:

    1. ในคอนโซล Firebase ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
    2. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ Google
    3. ขยายส่วนการกำหนดค่า Web SDK และคัดลอกรหัสไคลเอ็นต์เว็บ (เช่น 123456-abc.apps.googleusercontent.com) ซึ่งแสดงถึงการอ้างสิทธิ์กลุ่มเป้าหมาย (aud) ของโทเค็นระบุตัวตน และจำเป็นสำหรับทั้ง Android และ iOS
    4. คลิกบันทึก
  3. อัปเดตไฟล์การกำหนดค่า Firebase และคัดลอกรหัสไคลเอ็นต์ iOS แบบย้อนกลับ

    1. ดาวน์โหลดไฟล์การกำหนดค่า Firebase ล่าสุดจากคอนโซล Firebase (google-services.json สำหรับ Android และ GoogleService-Info.plist สำหรับ iOS) แล้วแทนที่สำเนาเก่าในโปรเจ็กต์ Unity (ดูหัวข้อเพิ่ม Firebase ลงในโปรเจ็กต์ Unity)
    2. iOS: เปิดไฟล์ GoogleService-Info.plist และคัดลอกค่าของคีย์ REVERSED_CLIENT_ID (เช่น com.googleusercontent.apps.12345-abc) คุณต้องใช้ค่านี้เพื่อกำหนดค่า URL Scheme สำหรับการเปลี่ยนเส้นทางของ iOS

ผสานรวมปลั๊กอิน Google Sign-In เข้ากับโปรเจ็กต์ Unity

  1. นำเข้าปลั๊กอิน:

    1. หากคุณกำลังผสานรวมเข้ากับโปรเจ็กต์ที่มีอยู่ ให้สำรองข้อมูลโปรเจ็กต์และนำปลั๊กอิน Google Sign-In เวอร์ชันเก่าออกก่อนดำเนินการต่อ
    2. ดาวน์โหลด GoogleSignInNative.unitypackage จาก GitHub และนำเข้าสู่โปรเจ็กต์ Unity (Assets > Import Package > Custom Package) ตรวจสอบว่าได้เลือกไฟล์ทั้งหมดแล้ว แล้วคลิกนำเข้า
  2. กำหนดการตั้งค่าปลั๊กอิน:

    1. ใน Unity Editor ให้ไปที่ Window > Google Sign-In Native > Settings
    2. วางรหัสไคลเอ็นต์เว็บลงในช่องแรก
    3. วางรหัสไคลเอ็นต์ iOS แบบย้อนกลับลงในช่องที่ 2
    4. คลิก Save Settings
  3. แก้ไขทรัพยากร Dependency แบบเนทีฟ

    1. ไปที่ Assets > External Dependency Manager > Android Resolver > Force Resolve
    2. รอข้อความแจ้งว่าดำเนินการสำเร็จ ซึ่งจะดาวน์โหลดไลบรารี Credential Manager ของ googleid และ androidx แบบเนทีฟ

เข้าถึงชั้นเรียน Firebase.Auth.FirebaseAuth

คลาส FirebaseAuth เป็นเกตเวย์สำหรับการเรียก API ทั้งหมด ซึ่งเข้าถึงได้ผ่าน FirebaseAuth.DefaultInstance
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

ตรวจสอบสิทธิ์ด้วย Firebase

  1. ตั้งค่า GoogleSignInManager ในฉาก:

    1. สร้าง GameObject เปล่าในฉากเริ่มต้นชื่อ GoogleSignInManager
    2. แนบสคริปต์ GoogleSignInManager.cs เข้ากับเหตุการณ์
    3. ลากชิ้นงาน GoogleSignInNativeSettings (อยู่ใน Assets/GoogleSignInNative/Resources) ไปยังช่องการตั้งค่าการลงชื่อเข้าใช้ในสคริปต์
  2. เรียกใช้ Google Sign-In และแลกเปลี่ยนโทเค็นระบุตัวตนเป็นข้อมูลเข้าสู่ระบบ Firebase

    สร้างสคริปต์ตัวควบคุมที่สมัครรับข้อมูล GoogleSignInManager.OnSignInCompleted และ GoogleSignInManager.OnSignInFailed, ทริกเกอร์การลงชื่อเข้าใช้ด้วย GoogleSignInManager.Instance.StartSignIn() และแลกเปลี่ยนโทเค็นรหัส Google ที่ได้เป็นข้อมูลเข้าสู่ระบบ Firebase โดยใช้ GoogleAuthProvider.GetCredential:

    using Firebase.Auth;
    using Firebase.Extensions;
    using UnityEngine;
    
    public class MyAuthController : MonoBehaviour
    {
        private FirebaseAuth auth;
    
        private void Awake()
        {
            auth = FirebaseAuth.DefaultInstance;
        }
    
        private void OnEnable()
        {
            GoogleSignInManager.OnSignInCompleted += HandleSignInSuccess;
            GoogleSignInManager.OnSignInFailed += HandleSignInFailure;
        }
    
        private void OnDisable()
        {
            GoogleSignInManager.OnSignInCompleted -= HandleSignInSuccess;
            GoogleSignInManager.OnSignInFailed -= HandleSignInFailure;
        }
    
        public void OnSignInButtonClick()
        {
            GoogleSignInManager.Instance.StartSignIn();
        }
    
        private void HandleSignInSuccess(string idToken)
        {
            Debug.Log("[Auth] Google Sign-In succeeded. Authenticating with Firebase...");
    
            Credential credential = GoogleAuthProvider.GetCredential(idToken, null);
            auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWithOnMainThread(task => {
                if (task.IsCanceled)
                {
                    Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
                    return;
                }
                if (task.IsFaulted)
                {
                    Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
                    return;
                }
    
                AuthResult result = task.Result;
                Debug.LogFormat("User signed in successfully: {0} ({1})",
                    result.User.DisplayName, result.User.UserId);
            });
        }
    
        private void HandleSignInFailure(string error)
        {
            Debug.LogError($"[Auth] Google Sign-In failed: {error}");
        }
    }
    

สร้างแอป

Android

  • ตรวจสอบว่าชื่อแพ็กเกจในการตั้งค่าโปรแกรมเล่นตรงกับข้อมูลเข้าสู่ระบบ Firebase และ Google Cloud OAuth ทุกประการ
  • ตรวจสอบว่าได้ตั้งค่าระดับ API ขั้นต่ำเป็น 34 ขึ้นไป
  • คลิก Build and Run

iOS

  • สร้างโปรเจ็กต์ใน Unity เพื่อสร้างโปรเจ็กต์ Xcode แล้วเปิดไฟล์ .xcworkspace ที่สร้างขึ้น
  • ใน Xcode ให้ไปที่แท็บ Signing & Capabilities แล้วเลือกทีมพัฒนา
  • ปลั๊กอินจะเพิ่ม URL Scheme ที่กำหนดเอง (REVERSED_CLIENT_ID) ลงในโปรเจ็กต์ Xcode โดยอัตโนมัติ สร้างและเรียกใช้ในอุปกรณ์จริง

ขั้นตอนถัดไป

หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และลิงก์กับข้อมูลเข้าสู่ระบบ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ที่ผู้ใช้ใช้ลงชื่อเข้าใช้ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ 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();