在 Firebase 中管理使用者

新增使用者

您可以在 Firebase 專案中透過四種方式建立新使用者:

  • 呼叫 createUserWithEmailAndPassword() 方法。
  • 使用聯合身分識別資訊提供者 (例如 Google 登入、Facebook 登入或 Apple) 首次登入使用者。

您也可以在 Firebase 控制台的「驗證」部分,透過「使用者」頁面建立新的密碼驗證使用者。

取得使用者個人資料

如要取得使用者的個人資料資訊,請使用 User 的屬性。有三種方式可取得代表目前使用者的 User 物件:

  • authStateChangesidTokenChangesuserChanges 串流:如果沒有使用者通過驗證,您的接聽程式會收到目前的 Usernull

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

    應用程式啟動時,系統會在還原本機儲存空間中的使用者憑證 (如有) 後觸發事件,也就是說,系統一初始化使用者狀態,就會一律呼叫接聽程式。然後,每當驗證狀態變更時,系統就會發出新事件,並更新使用者狀態。

    只要監聽驗證狀態,就能建構可對這些驗證狀態變更做出反應的使用者介面。請勿將 authStateChanges().listen(...) 直接放在小工具的建構方法中,因為每次重建時都會建立新的訂閱項目。如要根據驗證狀態更新 UI,請使用 StreamBuilder

    StreamBuilder<User?>(
    stream: FirebaseAuth.instance.authStateChanges(),
    builder: (BuildContext context, AsyncSnapshot<User?> snapshot) {
      if (snapshot.hasError) {
        return const Text('Something went wrong');
      }
    
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Text("Loading...");
      }
    
      if (!snapshot.hasData) {
        return const SignInScreen();
      }
    
      final user = snapshot.data!;
      return HomeScreen(userId: user.uid);
    },
    )
    

    這個方法可確保使用者驗證狀態變更時,小工具樹狀結構會自動重建。

  • 驗證 (signIn-) 方法傳回的 UserCredential 物件:UserCredential 物件具有 user 屬性,其中包含目前的 User

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • FirebaseAuth 執行個體的 currentUser 屬性:如果您確定使用者目前已登入,可以從 currentUser 屬性存取 User

    if (FirebaseAuth.instance.currentUser != null) {
      print(FirebaseAuth.instance.currentUser?.uid);
    }
    

    currentUser可能null有兩個原因:

    • 使用者未登入。
    • 驗證物件尚未完成初始化。如果您使用監聽器追蹤使用者的登入狀態,則不需要處理這個情況。

取得使用者的特定供應商個人資料資訊

如要取得從連結至使用者的登入服務供應商擷取的個人資料資訊,請使用 providerData 屬性。例如:

if (user != null) {
    for (final providerProfile in user.providerData) {
        // ID of the provider (google.com, apple.com, etc.)
        final provider = providerProfile.providerId;

        // UID specific to the provider
        final uid = providerProfile.uid;

        // Name, email address, and profile photo URL
        final name = providerProfile.displayName;
        final emailAddress = providerProfile.email;
        final profilePhoto = providerProfile.photoURL;
    }
}

更新使用者個人資料

您可以使用 update 方法更新使用者的基本個人資料資訊,包括顯示名稱和個人資料相片網址。例如:

await user?.updateDisplayName("Jane Q. User");
await user?.updatePhotoURL("https://example.com/jane-q-user/profile.jpg");

設定使用者的電子郵件地址

您可以使用 updateEmail() 方法設定使用者的電子郵件地址。例如:

await user?.updateEmail("janeq@example.com");

傳送驗證電子郵件給使用者

您可以使用 sendEmailVerification() 方法,傳送地址驗證電子郵件給使用者。例如:

await user?.sendEmailVerification();

您可以在 Firebase 主控台的「驗證」部分,透過「電子郵件範本」頁面自訂電子郵件範本。請參閱 Firebase 說明中心的「電子郵件範本」。

您也可以透過繼續網址傳遞狀態,在傳送驗證電子郵件時重新導向回應用程式。

此外,您也可以在傳送電子郵件前,更新 Auth 執行個體上的語言代碼,將驗證電子郵件在地化。例如:

await FirebaseAuth.instance.setLanguageCode("fr");
await user?.sendEmailVerification();

設定使用者密碼

您可以使用 updatePassword() 方法設定使用者密碼。例如:

await user?.updatePassword(newPassword);

傳送密碼重設電子郵件

您可以使用 sendPasswordResetEmail() 方法傳送密碼重設電子郵件給使用者。例如:

await FirebaseAuth.instance
    .sendPasswordResetEmail(email: "user@example.com");

您可以在 Firebase 主控台的「驗證」部分,透過「電子郵件範本」頁面自訂電子郵件範本。請參閱 Firebase 說明中心的「電子郵件範本」。

您也可以透過「繼續網址」傳遞狀態,在傳送密碼重設電子郵件時重新導向回應用程式。

此外,您可以在傳送電子郵件前,更新 Auth 執行個體上的語言代碼,將密碼重設電子郵件本地化。例如:

await FirebaseAuth.instance.setLanguageCode("fr");

您也可以透過 Firebase 控制台傳送密碼重設電子郵件。

刪除使用者

您可以使用 delete() 方法刪除使用者帳戶。例如:

await user?.delete();

您也可以在 Firebase 主控台的「驗證」部分,透過「使用者」頁面刪除使用者。

重新驗證使用者

部分安全性相關操作 (例如刪除帳戶設定主要電子郵件地址變更密碼) 必須由最近登入的使用者執行。如果您執行其中一項動作,但使用者登入時間過久,動作就會失敗並擲回代碼為 requires-recent-loginFirebaseAuthException。發生這種情況時,請向使用者索取新的登入憑證,並將憑證傳遞至 reauthenticate,重新驗證使用者。例如:

// Prompt the user to re-provide their sign-in credentials.
// Then, use the credentials to reauthenticate:
await user?.reauthenticateWithCredential(credential);

匯入使用者帳戶

您可以使用 Firebase CLI 的 auth:import 指令,將檔案中的使用者帳戶匯入 Firebase 專案。例如:

firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14