将您的应用连接到 Firebase
如果您尚未安装并初始化 Flutter 的 Firebase SDK 。
将 Firebase 身份验证添加到您的应用
在 Flutter 项目的根目录下,运行以下命令来安装插件:
flutter pub add firebase_auth
完成后,重新构建您的 Flutter 应用程序:
flutter run
在你的 Dart 代码中导入插件:
import 'package:firebase_auth/firebase_auth.dart';
要使用身份验证提供程序,您需要在Firebase 控制台中启用它。转到 Firebase 身份验证部分中的登录方法页面以启用电子邮件/密码登录以及您希望用于您的应用的任何其他身份提供程序。
(可选)使用 Firebase 本地模拟器套件进行原型设计和测试
在讨论您的应用如何对用户进行身份验证之前,让我们介绍一组可用于原型化和测试身份验证功能的工具:Firebase Local Emulator Suite。如果您要在身份验证技术和提供者之间做出决定,使用身份验证和 Firebase 安全规则尝试具有公共和私有数据的不同数据模型,或者对登录 UI 设计进行原型设计,那么能够在不部署实时服务的情况下在本地工作可能是一个好主意.
身份验证模拟器是本地模拟器套件的一部分,它使您的应用程序能够与模拟的数据库内容和配置以及可选的模拟项目资源(函数、其他数据库和安全规则)进行交互。
使用身份验证模拟器只需几个步骤:
在应用程序的测试配置中添加一行代码以连接到模拟器。
从本地项目目录的根目录运行
firebase emulators:start
。使用本地模拟器套件 UI 进行交互式原型设计,或使用身份验证模拟器 REST API 进行非交互式测试。
调用
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!');
}
});
发生以下情况时会触发事件:
- 在监听器注册之后。
- 当用户登录时。
- 当前用户退出时。
- 当前用户的令牌发生变化时。
- 修改自定义声明后,用户登录或重新验证。结果颁发的 ID 令牌将包含最新的声明。
- 旧令牌过期后,现有用户会话会刷新其 ID 令牌。
- 通过调用
FirebaseAuth.instance.currentUser.getIdTokenResult(true)
强制刷新 ID 令牌。
有关更多详细信息,请参阅向客户端传播自定义声明
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 Admin SDK 或 Firebase 控制台禁用或删除User
, idTokenChanges()
、 userChanges()
和authStateChanges()
也不会触发。您必须使用FirebaseAuth.instance.currentUser.reload()
强制重新加载,这将导致您可以在应用代码中捕获和处理的user-disabled
或user-not-found
异常。
持久认证状态
适用于所有平台的 Firebase SDK 提供开箱即用的支持,以确保您的用户的身份验证状态在应用重新启动或页面重新加载时保持不变。
在 Android 和 iOS 等原生平台上,此行为是不可配置的,并且用户的身份验证状态将在应用程序重新启动之间保留在设备上。用户可以使用设备设置清除应用程序缓存的数据,这将擦除任何正在存储的现有状态。
在 Web 平台上,用户的身份验证状态存储在本地存储中。如果需要,您可以将此默认行为更改为仅保留当前会话的身份验证状态,或者根本不保留。要配置这些设置,请调用setPersistence()
方法。 (在本机平台上,将抛出UnimplementedError
。)
// Disable persistence on web platforms
await FirebaseAuth.instance.setPersistence(Persistence.NONE);
下一步
探索有关使用受支持的身份和身份验证服务登录和注册用户的指南。