Search code examples
firebasefirebase-authenticationfirebase-cli

Firebase CLI: execute arbitrary Firebase Authentication requests to Firebase Emulator


Using the Firebase CLI, I'm executing arbitrary JavaScript that's stored in a file. In that script, I'm trying to make calls to admin.auth().something(), but it doesn't work against the Firebase Emulator. This is in contrast to making calls to Firestore, which works perfectly fine with the Emulator.

Firestore (everything works)

GCP

This makes calls to Firestore on GCP and it succeeds:

const admin = require('firebase-admin');
admin.initializeApp({ projectId: 'my-project' });
const db = admin.firestore();

(async () => {
  const widget = await db.doc('/widgets/123456789').get();
  console.log(widget.data().name);
})();

Emulator

This also succeeds:

const admin = require('@firebase/testing');
const db = admin
  .initializeAdminApp({ projectId: 'my-project' })
  .firestore();

(async () => {
  const widget = await db.doc('/widgets/123456789').get();
  console.log(widget.data().name);
})();

Firebase Auth (GCP works but Emulator does not)

GCP

This makes calls to Firebase Auth on GCP and it succeeds:

const admin = require('firebase-admin');
admin.initializeApp({ projectId: 'my-project' });

(async () => {
  const user = await admin
    .auth()
    .getUser('user123456789');

  console.log(user.email);
})();

Emulator

This fails:

const admin = require('@firebase/testing');
const auth = admin
  .initializeAdminApp({ projectId: 'my-project' })
  .auth();

(async () => {
  const user = await auth.getUser('user123456789');

  console.log(user.email);
})();

The error message is:

C:\Users\...\node_modules\@firebase\testing\node_modules\@firebase\component\dist\index.cjs.js:134
                throw e;
                ^
[t [Error]: Your API key is invalid, please check you have copied it correctly.] {
  code: 'auth/invalid-api-key',
  a: null
}

I'm not sure what API key they're referring to, as the request is against the Emulator. How can I execute Firebase Auth requests against the Emulator using Firebase CLI?


Solution

  • To send requests against Firebase Emulator Auth, set the following environment variables and use the standard Firebase Admin SDK (firebase-admin) instead of using @firebase/testing:

    process.env.FIREBASE_AUTH_EMULATOR_HOST = 'localhost:9099';
    process.env.FIRESTORE_EMULATOR_HOST = 'localhost:8080';
    
    const admin = require('firebase-admin');
    admin.initializeApp({ projectId: 'emulator projectId' });
    

    Now this works:

    (async () => {
      const user = await auth.getUser('user123456789');
    
      console.log(user.email);
    })();