Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Flutter 上的 Firebase 身份驗證入門

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

將您的應用連接到 Firebase

如果您尚未安裝並初始化 Flutter 的 Firebase SDK

將 Firebase 身份驗證添加到您的應用

  1. 在 Flutter 項目的根目錄下,運行以下命令來安裝插件:

    flutter pub add firebase_auth
    
  2. 完成後,重新構建您的 Flutter 應用程序:

    flutter run
    
  3. 在你的 Dart 代碼中導入插件:

    import 'package:firebase_auth/firebase_auth.dart';
    

要使用身份驗證提供程序,您需要在Firebase 控制台中啟用它。轉到 Firebase 身份驗證部分中的登錄方法頁面,以啟用電子郵件/密碼登錄以及您希望用於您的應用的任何其他身份提供程序。

(可選)使用 Firebase 本地模擬器套件進行原型設計和測試

在討論您的應用如何對用戶進行身份驗證之前,讓我們介紹一組可用於原型化和測試身份驗證功能的工具:Firebase Local Emulator Suite。如果您要在身份驗證技術和提供者之間做出決定,使用身份驗證和 Firebase 安全規則嘗試具有公共和私有數據的不同數據模型,或者對登錄 UI 設計進行原型設計,那麼能夠在不部署實時服務的情況下在本地工作可能是一個好主意.

身份驗證模擬器是本地模擬器套件的一部分,它使您的應用程序能夠與模擬的數據庫內容和配置以及可選的模擬項目資源(函數、其他數據庫和安全規則)進行交互。

使用身份驗證模擬器只需幾個步驟:

  1. 在應用程序的測試配置中添加一行代碼以連接到模擬器。

  2. 從本地項目目錄的根目錄運行firebase emulators:start

  3. 使用本地模擬器套件 UI 進行交互式原型設計,或使用身份驗證模擬器 REST API 進行非交互式測試。

  4. 調用useAuthEmulator()指定模擬器地址和端口:

    Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    
    // Ideal time to initialize
    await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);
    //...
    }
    

將您的應用程序連接到身份驗證模擬器中提供了詳細指南。有關詳細信息,請參閱本地仿真器套件介紹

現在讓我們繼續討論如何對用戶進行身份驗證。

檢查當前身份驗證狀態

Firebase Auth 提供了許多方法和實用程序,使您能夠將安全身份驗證集成到新的或現有的 Flutter 應用程序中。在許多情況下,您需要了解用戶的身份驗證狀態,例如他們是登錄還是註銷。

Firebase Auth 使您能夠通過Stream實時訂閱此狀態。一旦被調用,該流將提供用戶當前身份驗證狀態的即時事件,然後在身份驗證狀態更改時提供後續事件。

監聽身份驗證狀態變化的方法有以下三種:

authStateChanges()

要訂閱這些更改,請在FirebaseAuth實例上調用authStateChanges()方法:

FirebaseAuth.instance
  .authStateChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

發生以下情況時會觸發事件:

  • 在監聽器註冊之後。
  • 當用戶登錄時。
  • 當前用戶退出時。

idTokenChanges()

要訂閱這些更改,請在FirebaseAuth實例上調用idTokenChanges()方法:

FirebaseAuth.instance
  .idTokenChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

發生以下情況時會觸發事件:

  • 在監聽器註冊之後。
  • 當用戶登錄時。
  • 當前用戶退出時。
  • 當前用戶的令牌發生變化時。

userChanges()

要訂閱這些更改,請在FirebaseAuth實例上調用userChanges()方法:

FirebaseAuth.instance
  .userChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });

發生以下情況時會觸發事件:

  • 在監聽器註冊之後。
  • 當用戶登錄時。
  • 當前用戶退出時。
  • 當前用戶的令牌發生變化時。
  • 當調用FirebaseAuth.instance.currentUser提供的以下方法時:
    • reload()
    • unlink()
    • updateEmail()
    • updatePassword()
    • updatePhoneNumber()
    • updateProfile()

持久認證狀態

適用於所有平台的 Firebase SDK 提供開箱即用的支持,以確保用戶的身份驗證狀態在應用重新啟動或頁面重新加載時保持不變。

在 Android 和 iOS 等原生平台上,此行為是不可配置的,並且用戶的身份驗證狀態將在應用程序重新啟動之間保留在設備上。用戶可以使用設備設置清除應用程序緩存的數據,這將擦除任何正在存儲的現有狀態。

在 Web 平台上,用戶的身份驗證狀態存儲在IndexedDB中。您可以使用Persistence.LOCAL更改持久性以將數據存儲在本地存儲中。如果需要,您可以將此默認行為更改為僅保留當前會話的身份驗證狀態,或者根本不保留。要配置這些設置,請調用以下方法FirebaseAuth.instanceFor(app: Firebase.app(), persistence: Persistence.LOCAL); .您仍然可以使用setPersistence(Persistence.NONE)更新每個 Auth 實例的持久性。

// Disable persistence on web platforms. Must be called on initialization:
final auth = FirebaseAuth.instanceFor(app: Firebase.app(), persistence: Persistence.NONE);
// To change it after initialization, use `setPersistence()`:
await auth.setPersistence(Persistence.LOCAL);

下一步

探索有關使用受支持的身份和身份驗證服務登錄和註冊用戶的指南。