新增使用者
您可以在 Firebase 專案中透過四種方式建立新使用者:
- 呼叫
createUserWithEmailAndPassword()
方法。 - 使用聯合身分識別資訊提供者 (例如 Google 登入、Facebook 登入或 Apple) 首次登入使用者。
您也可以在 Firebase 控制台的「驗證」部分,透過「使用者」頁面建立新的密碼驗證使用者。
取得使用者個人資料
如要取得使用者的個人資料資訊,請使用 User
的屬性。有三種方式可取得代表目前使用者的 User
物件:
authStateChanges
、idTokenChanges
和userChanges
串流:如果沒有使用者通過驗證,您的接聽程式會收到目前的User
或null
: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-login
的 FirebaseAuthException
。發生這種情況時,請向使用者索取新的登入憑證,並將憑證傳遞至 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