Open
Description
Describe your environment
- Operating System version: Docker / Linux / Debian 16
- Firebase SDK version:
[email protected]
- Firebase Product: database
- Node.js version: 16.17
- NPM version: 8.15
Describe the problem
Using the database
per firebase-admin
with emulators throws an error.
Steps to reproduce:
import admin from 'firebase-admin'
process.env.GCLOUD_PROJECT = 'demo'
process.env.FIREBASE_AUTH_EMULATOR_HOST = 'localhost:9099'
const demoApp = admin.initializeApp({
databaseURL: 'http://localhost:9000/?ns=demo-default-rtdb',
})
// This uses the emulator and works.
await demoApp.auth().listUsers()
.then(l => console.log(l))
// This fails with FirebaseAppError.
// code: app/invalid-credential
// Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND"
// in firebase-admin/lib/app/firebase-app.js:85:19
await demoApp.database().getRules()
.then(r => console.log(r))
Working alternative:
Just supplying a stub for the Credential
interface works, as the token is never verified.
I think this should be added to the docs at https://firebase.google.com/docs/emulator-suite/connect_rtdb#admin_sdks and https://firebase.google.com/docs/database/admin/start.
import admin from 'firebase-admin'
process.env.GCLOUD_PROJECT = 'demo'
process.env.FIREBASE_AUTH_EMULATOR_HOST = 'localhost:9099'
const demoApp = admin.initializeApp({
credential: {
getAccessToken: () => Promise.resolve({access_token: 'foo', expires_in: 3600}),
},
databaseURL: 'http://localhost:9000/?ns=demo-default-rtdb',
})
await demoApp.auth().listUsers()
.then(l => console.log(l))
await demoApp.database().getRules()
.then(r => console.log(r))