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

回到顶部