Firebase Authentication 使用入门 (Flutter)

将您的应用关联至 Firebase

安装并初始化 Firebase SDKs for Flutter(如果您尚未这样做)。

将 Firebase Authentication 添加到您的应用

  1. 从 Flutter 项目的根目录运行以下命令,以安装该插件:

    flutter pub add firebase_auth
    
  2. 完成后,重新构建您的 Flutter 应用:

    flutter run
    
  3. 在 Dart 代码中导入该插件:

    import 'package:firebase_auth/firebase_auth.dart';
    

如需使用身份验证提供方,您需要在 Firebase 控制台中启用该提供方。浏览到“Firebase Authentication”部分中的“Sign-in Method”(登录方法)页面,启用电子邮件地址/密码登录以及您的应用所需的所有其他身份提供方。

(可选)使用 Firebase Local Emulator Suite 进行原型设计和测试

在介绍应用如何对用户进行身份验证之前,我们先介绍一套可用于对 Authentication 功能进行原型设计和测试的工具,即 Firebase Local Emulator Suite。如果您正要从几种身份验证方法和数个提供方中做出选择、对使用 Authentication 和 Firebase 安全规则的公共和私有数据尝试不同的数据模型,或者想要对登录界面进行原型设计,那么无需实际部署即可在本地进行上述工作是非常理想的。

Authentication 模拟器是 Local Emulator Suite 的一部分,可让您的应用与模拟的数据库内容和配置进行交互,以及视需要与您的模拟项目资源(函数、其他数据库和安全规则)进行交互。

如需使用 Authentication 模拟器,只需完成几个步骤:

  1. 向应用的测试配置添加一行代码以连接到模拟器。

  2. 从本地项目的根目录运行 firebase emulators:start

  3. 使用 Local Emulator Suite 界面进行交互式原型设计,或使用 Authentication 模拟器 REST API 进行非交互式测试。

  4. 调用 useAuthEmulator() 以指定模拟器地址和端口:

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

如需查看详细指南,请参阅将您的应用连接到 Authentication 模拟器。如需了解详情,请参阅 Local Emulator Suite 简介

接下来,我们来看看如何对用户进行身份验证。

检查当前身份验证状态

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);

后续步骤

浏览有关使用支持的身份和身份验证服务登录和注册用户的指南。