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

1 回复

更多关于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权限。使用服务器端解决方案来处理敏感操作是更加安全和合理的做法。

回到顶部