使用 Unity 使用密碼式帳戶向 Firebase 驗證

您可以使用 Firebase Authentication,讓使用者透過電子郵件地址和密碼向 Firebase 驗證身分,並管理應用程式的密碼型帳戶。

事前準備

如要使用 Firebase Authentication,請先完成下列步驟:

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

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

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

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

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

存取 Firebase.Auth.FirebaseAuth 類別

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

建立以密碼為基礎的帳戶

如要建立含有密碼的新使用者帳戶,請在應用程式的登入程式碼中完成下列步驟:

  1. 當新使用者透過應用程式的註冊表單註冊時,請完成應用程式要求的任何新帳戶驗證步驟,例如確認新帳戶的密碼是否正確輸入,以及是否符合複雜度規定。
  2. 將新使用者的電子郵件地址和密碼傳遞至 FirebaseAuth.CreateUserWithEmailAndPassword,即可建立新帳戶:
    auth.CreateUserWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("CreateUserWithEmailAndPasswordAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("CreateUserWithEmailAndPasswordAsync encountered an error: " + task.Exception);
        return;
      }
    
      // Firebase user has been created.
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("Firebase user created successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });

透過電子郵件地址和密碼登入使用者帳戶

使用密碼登入使用者的步驟,與建立新帳戶的步驟類似。在應用程式的登入函式中,請執行下列操作:

  1. 使用者登入應用程式時,請將使用者的電子郵件地址和密碼傳遞至 FirebaseAuth.SignInWithEmailAndPassword
    auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithEmailAndPasswordAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithEmailAndPasswordAsync 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);
    });
  2. 您也可以建立憑證並登入,就像其他工作流程一樣:
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    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);
    });

建議:設定密碼政策

您可以強制規定密碼複雜度,提高帳戶安全性。

如要為專案設定密碼政策,請在 Firebase 控制台的「安全性」>「驗證」>「設定」分頁中,開啟「密碼政策」部分:

驗證設定

Firebase Authentication 密碼政策支援下列密碼規定:

  • 須有小寫字元

  • 須有大寫字元

  • 必須包含數字字元

  • 必須包含非英數字元

    下列字元符合非英數字元規定: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • 密碼長度下限 (6 到 30 個字元,預設為 6 個字元)

  • 密碼長度上限 (最多 4096 個半形字元)

您可以透過下列兩種模式強制執行密碼政策:

  • 要求:使用者如未改用符合政策的密碼,就無法註冊。

  • 通知:使用者可以註冊不符合規定的密碼。使用這個模式時,您應在用戶端檢查使用者密碼是否符合政策規定,如果不符合,請以某種方式提示使用者更新密碼。

新使用者一律須選擇符合政策的密碼。

如果您有活躍使用者,建議不要啟用「登入時強制升級」,除非您打算封鎖密碼不符合政策的使用者存取權。請改用通知模式,讓使用者以目前的密碼登入,並告知他們密碼不符合哪些規定。

建議:啟用電子郵件列舉防護

如果電子郵件地址必須註冊但未註冊 (例如使用電子郵件地址和密碼登入時),或必須未使用但已註冊 (例如變更使用者的電子郵件地址時),部分以電子郵件地址做為參數的 Firebase Authentication 方法會擲回特定錯誤。雖然這項功能有助於向使用者建議特定解決方法,但惡意人士也可能濫用這項功能,找出使用者註冊的電子郵件地址。

為降低這項風險,建議您使用 Google Cloud gcloud 工具,為專案啟用電子郵件列舉保護機制。請注意,啟用這項功能會改變 Firebase Authentication 的錯誤回報行為,請確保應用程式不會依賴更具體的錯誤。

後續步驟

使用者首次登入後,系統會建立新的使用者帳戶,並連結至使用者登入時使用的憑證 (即使用者名稱和密碼、電話號碼或驗證供應商資訊)。這個新帳戶會儲存在 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 DatabaseCloud Storage 安全規則中,您可以從 auth 變數取得已登入使用者的專屬使用者 ID, 並使用該 ID 控制使用者可存取的資料。

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

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

auth.SignOut();