Flutter Firebase Admin管理插件dart_firebase_admin_plus的使用
Flutter Firebase Admin管理插件dart_firebase_admin_plus的使用
欢迎使用此项目!这是一个将 Node 的 Firebase Admin SDK 移植到 Dart 的项目。
⚠️ 注意:该项目仍处于早期阶段,某些功能可能缺失或存在错误。目前仅支持 Firestore,更多功能(如认证)即将推出。
目录
开始使用
在使用 Firebase 之前,我们首先需要进行身份验证。
目前有两种选择:
- 使用环境变量连接
- 指定一个
service-account.json
文件
使用环境变量连接
要通过环境变量连接,你需要安装 Firebase CLI。
完成后,你可以运行:
firebase login
然后登录到你选择的项目。
从那里,你可以让你的 Dart 程序通过环境变量进行身份验证:
import 'package:dart_firebase_admin/dart_firebase_admin.dart';
void main() {
final admin = FirebaseAdminApp.initializeApp(
'<你的项目名称>',
// 这将从环境中获取身份验证信息
Credential.fromApplicationDefaultCredentials(),
);
// TODO 使用 Admin SDK
final firestore = Firestore(admin);
firestore.doc('hello/world').get();
}
使用 service-account.json
文件连接
另外,你可以选择使用 service-account.json
文件。
此文件可以在 Firebase 控制台中获得。访问以下 URL:
https://console.firebase.google.com/u/0/project/<你的项目名称>/settings/serviceaccounts/adminsdk
确保将 <你的项目名称>
替换为你的项目名称。在那里,按照步骤下载文件并将其放置在你的项目中的任何位置。
⚠️ 注意: 此文件应保持私密。不要将其提交到公共仓库。
完成后,你可以在 Dart 程序中使用以下方式认证:
import 'package:dart_firebase_admin/dart_firebase_admin.dart';
Future<void> main() async {
final admin = FirebaseAdminApp.initializeApp(
'<你的项目名称>',
// 使用新下载的文件登录。
Credential.fromServiceAccount(
File('<路径到你的 service-account.json 文件>'),
),
);
// TODO 使用 Admin SDK
final firestore = Firestore(admin);
firestore.doc('hello/world').get();
// 别忘了在程序结束时关闭 Admin SDK
await admin.close();
}
Firestore
使用方法
首先,确保遵循 如何认证 的步骤。你应该现在有一个 FirebaseAdminApp
对象的实例。
你可以使用该对象创建一个 Firestore
对象,如下所示:
// 在前面的步骤中获得
FirebaseAdminApp admin;
final firestore = Firestore(admin);
从此以后,使用 Firestore 与 Admin SDK 类似于使用 FlutterFire。
使用此 Firestore
对象,你会找到常见的集合/查询/文档对象。
例如,你可以执行 where
查询:
// 以下列出了所有年龄大于18岁的用户
final collection = firestore.collection('users');
final adults = collection.where('age', WhereFilter.greaterThan, 18);
final adultsSnapshot = await adults.get();
for (final adult in adultsSnapshot.docs) {
print(adult.data()['age']);
}
复合查询也受支持:
// 列出名字为John或Jack的用户
firestore
.collection('users')
.whereFilter(
Filter.or([
Filter.where('firstName', WhereFilter.equal, 'John'),
Filter.where('firstName', WhereFilter.equal, 'Jack'),
]),
);
你也可以获取特定文档:
// 打印ID为"123"的用户的年龄
final user = await firestore.doc('users/123').get();
print(user.data()?['age']);
支持的功能
Firestore | 状态 |
---|---|
firestore.listCollections() | ✅ |
reference.id | ✅ |
reference.listCollections() | ✅ |
reference.parent | ✅ |
reference.path | ✅ |
reference.== | ✅ |
reference.withConverter | ✅ |
collection.listDocuments | ✅ |
collection.add | ✅ |
collection.get | ✅ |
collection.create | ✅ |
collection.delete | ✅ |
collection.set | ✅ |
collection.update | ✅ |
collection.collection | ✅ |
query.where(‘field’, operator, value) | ✅ |
query.where(‘field.path’, operator, value) | ✅ |
query.where(FieldPath(’…’), operator, value) | ✅ |
query.whereFilter(Filter.and(a, b)) | ✅ |
query.whereFilter(Filter.or(a, b)) | ✅ |
query.startAt | ✅ |
query.startAtDocument | ✅ |
query.startAfter | ✅ |
query.startAfterDocument | ✅ |
query.endAt | ✅ |
query.endAtDocument | ✅ |
query.endAfter | ✅ |
query.endAfterDocument | ✅ |
query.select | ✅ |
query.orderBy | ✅ |
query.limit | ✅ |
query.limitToLast | ✅ |
query.offset | ✅ |
querySnapshot.docs | ✅ |
querySnapshot.readTime | ✅ |
documentSnapshots.data | ✅ |
documentSnapshots.readTime/createTime/updateTime | ✅ |
documentSnapshots.id | ✅ |
documentSnapshots.exists | ✅ |
documentSnapshots.data | ✅ |
documentSnapshots.get(fieldPath) | ✅ |
FieldValue.documentId | ✅ |
FieldValue.increment | ✅ |
FieldValue.arrayUnion | ✅ |
FieldValue.arrayRemove | ✅ |
FieldValue.delete | ✅ |
FieldValue.serverTimestamp | ✅ |
collectionGroup | ✅ |
GeoPoint | ✅ |
Timestamp | ✅ |
querySnapshot.docsChange | ⚠️ |
query.onSnapshot | ❌ |
runTransaction | ❌ |
BundleBuilder | ❌ |
认证
使用方法
首先,确保遵循 如何认证 的步骤。你应该现在有一个 FirebaseAdminApp
对象的实例。
你可以使用该对象创建一个 Auth
对象,如下所示:
// 在前面的步骤中获得
FirebaseAdminApp admin;
final auth = Auth(admin);
然后,你可以使用这个 Auth
对象执行各种认证操作。例如,你可以生成密码重置链接:
final link = await auth.generatePasswordResetLink(
'hello@example.com',
);
支持的功能
Auth | 状态 |
---|---|
auth.tenantManager | ❌ |
auth.projectConfigManager | ❌ |
auth.generatePasswordResetLink | ✅ |
auth.generateEmailVerificationLink | ✅ |
auth.generateVerifyAndChangeEmailLink | ✅ |
auth.generateSignInWithEmailLink | ✅ |
auth.listProviderConfigs | ✅ |
auth.createProviderConfig | ✅ |
auth.updateProviderConfig | ✅ |
auth.getProviderConfig | ✅ |
auth.deleteProviderConfig | ✅ |
auth.createCustomToken | ✅ |
auth.setCustomUserClaims | ✅ |
auth.verifyIdToken | ✅ |
auth.revokeRefreshTokens | ✅ |
auth.createSessionCookie | ✅ |
auth.verifySessionCookie | ✅ |
auth.importUsers | ✅ |
auth.listUsers | ✅ |
auth.deleteUser | ✅ |
auth.deleteUsers | ✅ |
auth.getUser | ✅ |
auth.getUserByPhoneNumber | ✅ |
auth.getUserByEmail | ✅ |
auth.getUserByProviderUid | ✅ |
auth.getUsers | ✅ |
auth.createUser | ✅ |
auth.updateUser | ✅ |
可用功能
消息传递
使用方法
首先,确保遵循 如何认证 的步骤。你应该现在有一个 FirebaseAdminApp
对象的实例。
然后,你可以创建一个 Messaging
实例,如下所示:
// 在前面的步骤中获得
FirebaseAdminApp admin;
final messaging = Messaging(admin);
然后,你可以使用这个 Messaging
对象与 Firebase 消息传递进行交互。例如,如果你想向特定设备发送通知,可以这样做:
await messaging.send(
TokenMessage(
// 目标设备的token
// 这个token可以通过使用FlutterFire的firebase_messaging获得:
// https://pub.dev/documentation/firebase_messaging/latest/firebase_messaging/FirebaseMessaging/getToken.html
token: "<目标设备的token>",
notification: Notification(
// 通知的内容
title: 'Hello',
body: 'World',
),
),
);
支持的功能
Messaging | 状态 |
---|---|
Messaging.send | ✅ |
Messaging.sendEach | ✅ |
Messaging.sendEachForMulticast | ✅ |
Messaging.subscribeToTopic | ❌ |
Messaging.unsubscribeFromTopic | ❌ |
TokenMessage | ✅ |
TopicMessage | ✅ |
ConditionMessage | ✅ |
Messaging.sendAll | ❌ |
Messaging.sendMulticast | ❌ |
完整示例
以下是完整的示例代码:
import 'package:dart_firebase_admin/dart_firebase_admin.dart';
import 'package:dart_firebase_admin/firestore.dart';
import 'package:dart_firebase_admin/messaging.dart';
Future<void> main() async {
final admin = FirebaseAdminApp.initializeApp(
'dart-firebase-admin',
Credential.fromApplicationDefaultCredentials(),
);
// // admin.useEmulator();
final messaging = Messaging(admin);
final result = await messaging.send(
TokenMessage(
token:
'e8Ap1n9UTQenyB-UEjNQt9:APA91bHhgc9RZYDcCKb7U1scQo1K0ZTSMItop8IqctrOcgvmN__oBo4vgbFX-ji4atr1PVw3Loug-eOCBmj4HVZjUE0aQBA0mGry7uL-7JuMaojhtl13MpvQtbZptvX_8f6vDcqei88O',
notification: Notification(
title: 'Hello',
body: 'World',
),
),
);
print(result);
final firestore = Firestore(admin);
final collection = firestore.collection('users');
await collection.doc('123').set({
'name': 'John Doe',
'age': 30,
});
final snapshot = await collection.get();
for (final doc in snapshot.docs) {
print(doc.data());
}
await admin.close();
}
更多关于Flutter Firebase Admin管理插件dart_firebase_admin_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Firebase Admin管理插件dart_firebase_admin_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于在Flutter项目中使用dart_firebase_admin_plus
插件来管理Firebase Admin,以下是一个基本的代码案例。请注意,由于Firebase Admin SDK通常用于服务器端(Node.js、Python、Java等),而dart_firebase_admin_plus
是为了在Dart环境下模拟一些Admin功能,所以它的使用场景和功能可能会受到限制。此外,运行Admin SDK通常需要服务帐户密钥文件,这在Flutter客户端应用中会带来安全风险,因此通常推荐在服务器端处理这些敏感操作。
不过,如果你确实需要在Flutter应用中通过某种方式使用Admin功能(尽管这通常不是推荐的做法),以下是一个基本的设置和使用示例:
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加dart_firebase_admin_plus
依赖:
dependencies:
flutter:
sdk: flutter
dart_firebase_admin_plus: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置服务帐户密钥文件
由于Firebase Admin SDK需要服务帐户密钥文件来认证,你需要将密钥文件(通常是JSON格式)放置在安全的位置。请注意,绝不要在客户端应用中直接包含服务帐户密钥。这里仅作为示例说明。
3. 初始化Admin应用
在Flutter应用的适当位置(如服务初始化代码中),配置并初始化Firebase Admin应用:
import 'package:dart_firebase_admin_plus/dart_firebase_admin_plus.dart';
Future<void> initializeFirebaseAdmin() async {
// 注意:这里仅作为示例,实际使用中应避免在客户端包含密钥文件路径
String credentialPath = 'path/to/your/serviceAccountKey.json';
try {
// 初始化应用
await FirebaseAdmin.initializeApp(
credential: ServiceAccountCredential.fromFile(credentialPath),
// 可选:指定数据库URL(如果需要)
// databaseURL: 'https://<your-database-name>.firebaseio.com',
);
print('Firebase Admin initialized successfully.');
} catch (e) {
print('Failed to initialize Firebase Admin: $e');
}
}
4. 使用Admin功能
一旦Admin应用初始化成功,你就可以使用dart_firebase_admin_plus
提供的功能了。例如,获取数据库引用并写入数据:
import 'package:dart_firebase_admin_plus/dart_firebase_admin_plus.dart';
Future<void> writeDataToDatabase() async {
// 确保Firebase Admin已经初始化
await initializeFirebaseAdmin();
// 获取数据库引用
var db = FirebaseAdmin.instance.firestore();
// 写入数据到集合中
await db.collection('users').doc('user123').set({
'name': 'John Doe',
'email': 'john.doe@example.com',
});
print('Data written to Firestore successfully.');
}
警告
- 安全性:直接在客户端应用中使用Firebase Admin SDK(或类似功能的库)是极其不安全的。服务帐户密钥文件应严格保密,并仅在受信任的服务器环境中使用。
- 替代方案:考虑使用Firebase Functions或其他服务器端技术来处理需要Admin权限的操作,然后通过HTTPS请求从Flutter客户端与这些服务交互。
结论
尽管上面的代码示例展示了如何在Flutter中使用dart_firebase_admin_plus
,但强烈建议重新考虑你的架构设计,避免在客户端应用中直接使用Admin权限。使用服务器端解决方案来处理敏感操作是更加安全和合理的做法。