使用 Google 登入和 Unity 進行驗證

您可以將 Google 登入功能整合至應用程式,讓使用者透過 Google 帳戶向 Firebase 驗證身分。

事前準備

設定 Unity 專案

使用 Firebase Authentication 前,請先完成下列事項:

  • 註冊 Unity 專案並設定使用 Firebase。

    • 如果 Unity 專案已使用 Firebase,代表已註冊並設定 Firebase。

    • 如果沒有 Unity 專案,可以下載範例應用程式。

  • 將 Firebase Unity SDK (具體來說是 FirebaseAuth.unitypackage) 新增至 Unity 專案。

請注意,將 Firebase 新增至 Unity 專案時,您必須在 Firebase 控制台和開啟的 Unity 專案中執行工作 (例如從控制台下載 Firebase 設定檔,然後移至 Unity 專案)。

設定 Firebase 專案和憑證

  1. Android:在 Firebase 控制台中指定應用程式的 SHA-1 指紋:

    1. 在 Firebase 控制台中,依序前往 「 Settings」(設定) > 「General」(一般) 分頁。
    2. 前往「您的應用程式」資訊卡,選取 Android 應用程式,然後在「SHA 憑證指紋」欄位中新增 SHA-1 指紋。

      您可以使用 keytool 擷取 KeyStore 的 SHA-1 指紋:

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

      如要進一步瞭解如何取得應用程式的 SHA 指紋,請參閱「驗證用戶端」。

  2. 啟用 Google 登入功能,並複製網頁用戶端 ID:

    1. 在 Firebase 控制台中,依序前往「Security」(安全性) >「Authentication」(驗證)。
    2. 在「登入方式」分頁,啟用「Google」登入供應商。
    3. 展開「Web SDK configuration」(Web SDK 設定) 專區,然後複製「Web client ID」(網頁用戶端 ID) (例如 123456-abc.apps.googleusercontent.com)。這代表 ID 權杖的目標對象 (aud) 宣告,Android 和 iOS 都需要這項資訊。
    4. 按一下「儲存」。
  3. 更新 Firebase 設定檔,並複製 iOS 反向用戶端 ID:

    1. 從 Firebase 控制台 (Android 適用 google-services.json,iOS 適用 GoogleService-Info.plist) 下載最新的 Firebase 設定檔,並取代 Unity 專案中的舊版檔案。(請參閱「將 Firebase 新增至 Unity 專案」)。
    2. iOS:開啟 GoogleService-Info.plist 檔案,並複製 REVERSED_CLIENT_ID 鍵的值 (例如 com.googleusercontent.apps.12345-abc)。設定 iOS 重新導向網址配置時,必須提供這個值。

將 Google 登入外掛程式整合至 Unity 專案

  1. 匯入外掛程式:

    1. 如要整合至現有專案,請先備份專案並移除舊版 Google 登入外掛程式,再繼續操作。
    2. 從 GitHub 下載 GoogleSignInNative.unitypackage,然後匯入 Unity 專案 (依序點選「Assets」>「Import Package」>「Custom Package」)。確認已選取所有檔案,然後按一下「Import」(匯入)。
  2. 調整外掛程式設定:

    1. 在 Unity 編輯器中,依序前往「Window」>「Google Sign-In Native」>「Settings」。
    2. 將網頁用戶端 ID 貼到第一個欄位。
    3. 將 iOS 反向用戶端 ID 貼到第二個欄位。
    4. 按一下「儲存設定」。
  3. 解決原生依附元件問題:

    1. 依序點選「Assets」(資產) >「External Dependency Manager」(外部依附元件管理員) >「Android Resolver」(Android 解析器) >「Force Resolve」(強制解析)。
    2. 等待成功訊息。這會下載原生 googleid 和 androidx Credential Manager 程式庫。

存取 Firebase.Auth.FirebaseAuth 類別

FirebaseAuth 類別是所有 API 呼叫的閘道。可透過 FirebaseAuth.DefaultInstance 存取。
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

使用 Firebase 驗證

  1. 在場景中設定 GoogleSignInManager:

    1. 在名為 GoogleSignInManager 的初始場景中建立空白 GameObject。
    2. 將 GoogleSignInManager.cs 指令碼附加到該物件。
    3. 將 GoogleSignInNativeSettings 資產 (位於 Assets/GoogleSignInNative/Resources) 拖曳至指令碼上的「Sign In Settings」版位。
  2. 觸發 Google 登入,並將 ID 權杖換成 Firebase 憑證:

    建立控制器指令碼,訂閱 GoogleSignInManager.OnSignInCompleted 和 GoogleSignInManager.OnSignInFailed,使用 GoogleSignInManager.Instance.StartSignIn() 觸發登入,並使用 GoogleAuthProvider.GetCredential 將產生的 Google ID 權杖交換為 Firebase 憑證:

    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

  • 確認「Player Settings」中的「Package Name」與 Firebase 和 Google Cloud OAuth 憑證完全一致。
  • 確認「Minimum API Level」設為 34 以上。
  • 按一下「Build and Run」。

iOS

  • 在 Unity 中建構專案,產生 Xcode 專案,然後開啟產生的 .xcworkspace 檔案。
  • 在 Xcode 中,前往「Signing & Capabilities」分頁,然後選取「Development Team」。
  • 外掛程式會自動將自訂網址配置 (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 變數取得已登入使用者的專屬使用者 ID,並用來控管使用者可存取的資料。

您可以將驗證供應商憑證連結至現有使用者帳戶,允許使用者透過多個驗證供應商登入應用程式。

如要登出使用者,請呼叫 SignOut():

auth.SignOut();