A Firebase Admin SDK for Dart

  Admin, Dart, Dashboard

Dart Firebase Admin

Welcome! This project is a port of Node’s Firebase Admin SDK to Dart.

⚠️ This project is still in its early stages, and some features may be missing or bugged. Currently, only Firestore is available, with more to come (auth next).

  • Dart Firebase Admin
  • Available features
  • Usage
    • Connecting to the SDK
      • Connecting using the environment
      • Connecting using a service-account.json file
    • Using Firestore
    • Using Auth

Available features

Firestore
reference.id ✅
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.onSnapshot ❌
query.select ✅
query.orderBy ✅
query.limit ✅
query.limitToLast ✅
query.offset ✅
querySnapshot.docs ✅
querySnapshot.readTime ✅
querySnapshot.docsChange ⚠️
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 ✅
runTransaction ❌
GeoPoint ✅
Timestamp ✅
BundleBuilder ❌
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 ✅

Usage

Connecting to the SDK

Before using Firebase, we must first authenticate.

There are currently two options:

  • You can connect using environment variables
  • Alternatively, you can specify a service-account.json file

Connecting using the environment

To connect using environment variables, you will need to have the Firebase CLI installed.

Once done, you can run:

firebase login

And log-in to the project of your choice.

From there, you can have your Dart program authenticate using the environment with:

import 'package:dart_firebase_admin/dart_firebase_admin.dart';

void main() {
  final admin = FirebaseAdminApp.initializeApp(
    '<your project name>',
    // This will obtain authentication information from the environment
    Credential.fromApplicationDefaultCredentials(),
  );

  // TODO use the Admin SDK
  final firestore = Firestore(admin);
  firestore.doc('hello/world').get();
}

Connecting using a service-account.json file

Alternatively, you can choose to use a service-account.json file.
This file can be obtained in your firebase console by going to:

https://console.firebase.google.com/u/0/project/<your-project-name>/settings/serviceaccounts/adminsdk

Make sure to replace <your-project-name> with the name of your project. One there, follow the steps and download the file. Place it anywhere you want in your project.

⚠️ Note: This file should be kept private. Do not commit it on public repositories.

After all of that is done, you can now authenticate in your Dart program using:

import 'package:dart_firebase_admin/dart_firebase_admin.dart';

void main() {
  final admin = FirebaseAdminApp.initializeApp(
    '<your project name>',
    // Log-in using the newly downloaded file.
    Credential.fromServiceAccount(
      File('<path to your service-account.json file>'),
    ),
  );

  // TODO use the Admin SDK
  final firestore = Firestore(admin);
  firestore.doc('hello/world').get();
}

Using Firestore

First, make sure to follow the steps on how to authenticate. You should now have an instance of a FirebaseAdminApp object.

You can now use this object to create a Firestore object as followed:

// Obtained in the previous steps
FirebaseAdminApp admin;
final firestore = Firestore(admin);

From this point onwards, using Firestore with the admin ADK is roughly equivalent to using FlutterFire.

Using this Firestore object, you’ll find your usual collection/query/document objects.

For example, you can perform a where query:

// The following lists all users above 18 years old
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']);
}

Composite queries are also supported:

// List users with either John or Jack as first name.
firestore
  .collection('users')
  .whereFilter(
    Filter.or([
      Filter.where('firstName', WhereFilter.equal, 'John'),
      Filter.where('firstName', WhereFilter.equal, 'Jack'),
    ]),
  );

Alternatively, you can fetch a specific document too:

// Print the age of the user with ID "123"
final user = await firestore.doc('users/123').get();
print(user.data()?['age']);

Using Auth

First, make sure to follow the steps on how to authenticate. You should now have an instance of a FirebaseAdminApp object.

You can now use this object to create a FirebaseAuth object as followed:

// Obtained in the previous steps
FirebaseAdminApp admin;
final auth = FirebaseAuth(admin);

You can then use this FirebaseAuth object to perform various auth operations. For example, you can generate a password reset link: