Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firebase app initialization fails with invalid-credential (firebase function initiatlization)

As per the documentation:

If you are using the Node.js Admin SDK in a Cloud Function, you can automatically initialize the SDK through the functions.config() variable:

admin.initializeApp(functions.config().firebase);

But when I try this very simple piece of code:

const functions = require('firebase-functions')
const admin = require('firebase-admin')

admin.initializeApp(functions.config().firebase)

exports.orhub = functions.https.onRequest((req, res) => {
    res.end()
})

I get the following error:

error: FIREBASE WARNING: {"code":"app/invalid-credential","message":"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: invalid_grant (Bad Request)\". There are two likely causes: (1) your server time is not properly synced or (2) your certificate key file has been revoked. To solve (1), re-sync the time on your server. To solve (2), make sure the key ID for your key file is still present at https://console.firebase.google.com/iam-admin/serviceaccounts/project. If not, generate a new key file at https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk."}

My Ubuntu pc has date and timezone automatically synced, so that's not the problem. I created this project today, so I got the latest modules.

So, what's the problem? Isn't "Cloud Functions" mentioned in the docs the same as Firebase functions?

like image 375
AFMeirelles Avatar asked Feb 06 '18 03:02

AFMeirelles


3 Answers

I had the same problem, and I solved it as follows:

  • Go to the firebase console / Settings / Service accounts
  • Click on the option of [ Generate new private key ]
  • Load the file to the project
  • Implementation code:

    const admin = require('firebase-admin');
    
    var serviceAccount = require('PATH/file_private_key.json');
    
    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
        databaseURL: "https://DATA_BASE_URL.firebaseio.com"
    });
    

More info: https://firebase.google.com/docs/database/admin/start

like image 166
JxDarkAngel Avatar answered Sep 17 '22 06:09

JxDarkAngel


Since version 5.9.1 of firebase-admin it's possible to call initializeApp without any arguments. See release notes here. I would suggest updating to the latest version.

like image 39
Peter Avatar answered Sep 19 '22 06:09

Peter


Firebase SDK for Cloud Functions upgrade guide: beta to version 1.0 or higher https://firebase.google.com/docs/functions/beta-v1-diff

New initialization syntax for firebase-admin firebase-admin is now initialized without any parameters within the Cloud Functions runtime.

Before (<= v0.9.1)

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

Now (>= v1.0.0)

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
like image 41
hamed hossani Avatar answered Sep 21 '22 06:09

hamed hossani