web-dev-qa-db-ja.com

エラー:デフォルトの認証情報をロードできませんでした(Firebase関数からFirestoreへ)

Firestoreデータベースで高度なクエリタスクを実行するFirebase Cloud FunctionsのonCall関数(つまり、AutoML自然言語に対してテキストクエリをチェックしてカテゴリを取得するなど)を記述しようとしていますが、クエリを実行しようとすると問題が発生し続けます関数からのデータベース:

Error getting documents ::  Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (/srv/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)

関数:

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

exports.query = functions.https.onCall((data, context) => {
    const text = data.text;
    var results = [];
    const promise = db.collection('providers').get()
    promise.then((snapshot) => {
        console.log('marker');
        snapshot.forEach((doc) => {
            results.Push({id: doc.id, data: doc.data()});
        });
        console.log('yessir');
        return {results: results};
    }).catch((err) => {
        console.log('Error getting documents :: ', err)
        console.log('nosir');
        return {results: "no results"};
    });
});

より長い出力:

Function execution started
Function execution took 8ms, finished with status code: 200
Error getting documents :: (etc, same error)
nosir

例2(実行中の変更なし):

Function execution started
Function execution took 1200 ms, finished with status code: 200
marker
yessir

この問題の原因や解決方法がわかりません。何か助けは?

よろしく。

37

同じエラー「デフォルトの資格情報を読み込めませんでした」が発生しました。

プロジェクトの依存関係をnpm updateで更新した後、エラーが発生しました。より正確には、firebase-adminおよびfirebase-functionsです。

更新前:

"dependencies": {
    "@google-cloud/firestore": "^1.3.0",
    "firebase-admin": "~7.0.0",
    "firebase-functions": "^2.2.0"
}

更新後:

"dependencies": {
    "@google-cloud/firestore": "^1.3.0",
    "firebase-admin": "^8.6.0",
    "firebase-functions": "^3.3.0"
}

serviceAccountKey.jsonをプロジェクトに追加し、firebaseプロジェクトのサービスアカウント設定で提供されたコードでインポートを変更しました。

から:

var admin = require('firebase-admin')

admin.initializeApp()

に:

var admin = require('firebase-admin');    
var serviceAccount = require('path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://my-project.firebaseio.com'
});

Firebaseプロジェクトのアカウント設定にアクセスするには、以下の @ Fernando Rocha の回答を参照してください。

21
dperonnet

それを解決するために私がしたことは、私のプロジェクトにfirebase admin sdkキーを追加することでした。

私はそれをダウンロードしました

https://console.firebase.google.com/u/0/project/YOUR_PROJECT_ID/ settings/serviceaccounts/adminsdk

Admin SDK Key Download Page

次にadmin.initializeApp();で次のように変更しました:

admin.initializeApp({
    credential: admin.credential.cert(require('../keys/admin.json'))
});

私のフォルダ構造は

├── key
│   ├── admin.json
├── src
│   ├── index.ts
50
Fernando Rocha

@aldobaieの回答は、私のユースケースで何が起こっているのかを理解するのに役立ちました。すべての呼び出しにasync/awaitを追加しない場合は、firestore呼び出しがプロミスを返すので、先頭にreturnを付けると同じ効果があります。

私の場合:

function doSomething(...) {
    return admin.firestore().collection(...).doc(...).get()
        .then((doc) => {...})
        .catch(err => {...})
}

module.exports = functions.firestore.document('collection/{docId}').onWrite((change, context) => {
    return doSomething()
})

受け入れられた答えは、Firebaseの推奨構成に反すると思います。関数環境はすでに管理者の認証情報にアクセスできるため、コードでキーを渡すことはお勧めしません。

私はそれをこのようにします:

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

私も同じ問題に遭遇しました。関数が機能することもあれば、_Error: Could not load the default credentials_エラーによって何度も機能することもあります。コールバックを監視することで、問題は解決したと思います。 awaitおよびasync接頭辞を使用してコールバックが呼び出されるまで、関数を実行し続ける必要があります。

Firebase Cloud Functionsでは、終了すると、コールバックを介してプロセッサにアクセスできません。そのため、_Error: Could not load the default credentials_エラーが発生します。

したがって、.then() functionの前にawaitを付け、関数の前にasyncを付け、関数の呼び出しの前にawaitを付けます。 。

_async function registerUser(..) {
    ...
    await admin.firestore().collection(..)...
    ...
}
_

これがお役に立てば幸いです。

11
aldobaie

別のオプションは、firebaseAdmin.initializeApp({ credential })の呼び出しで設定する代わりに、 環境変数にサービスアカウントキーを設定する にすることです。

Linux

export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"

Windows PowerShell

$env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\[FILE_NAME].json"

追記:さらに優れたオプションは ローカルエミュレータスイートを使用 にすることです。

4
Shaun Luttin

何も問題はありませんが、@ Fernandoソリューションを使用したくありません。

Prdとnon-prd環境があります。 firebase useコマンドを使用して、変更を正しい環境にプッシュします。デプロイすると、firebaseはデフォルトのサービスアカウントを使用します。また、プロジェクトフォルダーやgitリポジトリにキーを含めたくありません。

私が解決した方法は他の人にはうまくいかないかもしれませんが、ここで共有したいと思います。

この問題は、firebaseプロジェクトの権限を更新して、閲覧者に編集者権限を付与したときに発生しました。私はその人をオーナーにして編集者に戻しました。消えた。それは修正として正当化するものではありませんが、私にとってはうまくいき、キーをダウンロードする必要はありません。

1
Narayanan

上記のどれでもありません。あなたはただ:

firebaseログイン-ブラウザログインを開きます

ログインしたらすぐに、コンソールに戻って実行します。

firebase init-正常に実行されます。

0
Gabriel Magaton

Firebaseサービスアカウントをプロジェクトにダウンロードし、次のように参照します。

<code>
  var admin = require("firebase-admin");
  var serviceAccount = require("path/to/serviceAccountKey.json");

  admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "<database-url>"
  });
</code>
0
George Aryee

Google Cloud関数が失敗する理由を理解しようとしているserpからここに来る人のために:

エラー:デフォルトの認証情報を読み込めませんでした。詳細については、 https://cloud.google.com/docs/authentication/getting-started を参照してください。 GoogleAuth.getApplicationDefaultAsyncで

上記のいずれも役に立たなかった場合は、@google/whatever依存関係:npm i -E @google/firestore@latest。次に、再構築、デプロイ、再試行します。 最近数回私に起こり、これはうまくいきました。

0

私は同じ問題を抱えていました。これを解決するには、project-dir/functions /ディレクトリ内のnpm updateでノードパッケージを更新します。最後に、再度デプロイします。

0
Juan Lopez

Firebaseエラーで同じ問題が発生しました:「デフォルトの認証情報を取得できませんでした。」

次にfirebase consoleに移動し、プロジェクト設定に移動します。ここにはService Accountsオプションがあります。そこをクリックすると、プロジェクト設定の下にGenerate new private keyが表示されます。プロジェクト言語のコードをコピーして、プロジェクトファイルに追加します。

_var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://your-database-url-that-is-given-under-admin-sdk-snippets"
});_

キーを生成した後、ダウンロードするオプションがあります。プロジェクトフォルダーに配置します。また、パスvar serviceAccount = require("path/to/serviceAccountKey.json");を設定します。これで準備は完了です。

0
akshay_sushir