programing

오류: 기본 자격 증명을 로드할 수 없습니다(Firestore에 대한 Firebase 함수).

goodcopy 2023. 6. 17. 22:49
반응형

오류: 기본 자격 증명을 로드할 수 없습니다(Firestore에 대한 Firebase 함수).

Firebase Cloud Functions에 대해 Firebase 데이터베이스에서 고급 쿼리 작업을 수행하는 onCall 함수를 작성하려고 합니다(예: 범주를 얻기 위해 AutoML natural lang에 대해 텍스트 쿼리를 확인하는 등). 하지만 함수에서 데이터베이스를 쿼리하는 동안 계속 문제가 발생합니다.

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

저는 이 문제가 어디서 발생하는지, 어떻게 해결해야 하는지 알 수 없습니다.도와드릴까요?

안부 전해요.

문제를 해결하기 위해 처음으로 한 일은 프로젝트에 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

그러나 일부에서 이미 언급한 것처럼 더 나은 관행과 안전한 접근 방식:환경 변수를 사용하여 자격 증명을 저장할 수 있습니다. 이렇게 하면 Github과 같은 저장소에 자격 증명을 커밋하지 않고 안전 위반으로부터 안전하게 보호하며 하드 코딩을 하지 않습니다.

프로젝트와 배포할 위치에 따라 다른 방법이 있습니다.

환경 변수(와 같은)를 만들고 액세스하는 방법에 대한 많은 튜토리얼이 있지만 아래 예와 같이 이름을 사용할 수 있습니다.

GOOGLE_APPLICATION_CREDENTIALS="/home/admin.json"

동일한 오류가 발생했습니다. "기본 자격 증명을 로드할 수 없습니다."

을 프젝트종업후오발류로 한 후 했습니다.npm update보다 정확하게는 파이어베이스-관리파이어베이스-기능입니다.

업데이트 전:

"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내 프로젝트에 적용하고 내 파이어베이스 프로젝트의 서비스 계정 설정에 제공된 코드로 가져오기를 변경했습니다.

시작:

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'
});

파이어베이스 프로젝트의 계정 설정에 액세스하려면 아래 @Fernando Rocha의 답변을 참조하십시오.

@aldobie의 대답은 제가 제 사용 사례에 대해 어떤 일이 일어나고 있는지 알아내는 데 도움이 되었습니다.모든 통화에 비동기/대기 기능을 추가하지 않으려는 사용자의 경우, 소방서에서 전화를 걸어 약속을 확인하고 다음과 같이 추가합니다.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)

저도 같은 문제에 부딪혔습니다.때때로 그 기능은 작동하고 여러 번 그것은 그것을 통해.Error: Could not load the default credentials문제는 콜백을 보고 해결된 것 같습니다콜백이 호출될 때까지 기능을 계속 실행해야 합니다.await그리고.async접두사

Firebase Cloud Functions는 일단 종료되면 콜백을 통해 프로세서에 액세스할 수 없습니다!그래서 우리는 그것을 얻는 것입니다.Error: Could not load the default credentialsmessage

가 있을 마다 당이언제지든신지▁so..then() function그것에 접두사를 붙이다.await그리고 그 안에 있는 함수에 접두사를 붙입니다.async 함수에 대한 에 "" " " " " " " 를 붙입니다.await.

async function registerUser(..) {
    ...
    await admin.firestore().collection(..)...
    ...
}

이것이 당신에게 도움이 되길 바랍니다!

또 다른 옵션은 서비스 계정 키를 환경 변수에 설정하는 것입니다.firebaseAdmin.initializeApp({ credential }).

리눅스

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"

포스트스크립트:더 나은 옵션은 로컬 에뮬레이터 제품군을 사용하는 것입니다.

알겠습니다. 그래서 저도 이 오류를 겪었고, 며칠 동안 여러 사이트, 기사, 비디오 등을 검토하면서 이 문제의 원인을 알아내려고 노력했습니다. 그래서 저는 저 자신과 어려움을 겪고 있는 다른 모든 사람들을 위해 적절한 답을 얻을 수 있었습니다.

이 스레드에는 이미 이 질문에 대한 답이 있습니다.하지만, 저는 그들 대부분을 따라 해보았지만 소용이 없었습니다.어떤 것은 보안 문제가 있고 어떤 것은 너무 모호해서 이해할 수 없습니다.저는 당신이 다른 답변 중 일부를 따를 경우 발생할 보안 문제도 해결하는 철저한 답변을 게시하기로 결정했습니다.

이제 그것을 제거했으니 시작해 보겠습니다!

먼저 이 링크로 이동해야 합니다. - 인증 시작하기

화면 중앙에 이 메시지가 표시됩니다. 다음으로 녹색으로 표시한 단추를 클릭합니다.서비스 계정 만들기 키 페이지가 나타납니다.

아래 이미지와 유사한 화면이 표시됩니다.

  • 서비스 계정 옵션에서 새 서비스 계정을 선택합니다.

  • 서비스 계정의 이름을 만듭니다.이것은 중요한 것이 아닙니다. 원하는 대로 말씀해 주십시오.

  • 역할 옵션으로 Project -> Owner를 선택합니다.

  • 마지막으로 키 유형에 대한 JSON 옵션을 선택한 다음 create를 누릅니다.

.json 파일을 만들고 다운로드해야 합니다.이 파일을 스마트하고 안전한 곳에 배치합니다.저는 프로젝트 루트에 'credentials'라는 폴더를 만들어 그 안에 배치했습니다.

또한 파일 이름을 좀 더 읽기 쉬운 이름으로 변경했습니다.그럴 필요는 없지만 파일/폴더 이름 지정 및 구조화 작업을 수행하는 것이 중요하므로 보다 읽기 쉬운 이름으로 이름을 변경하는 것이 좋습니다.

이 파일은 개인적인 파일이므로 github 저장소/firebase 운영 등에 포함되어서는 안 됩니다.이 파일은 당신과 당신만을 위한 것입니다!)

그런 다음 명령 프롬프트 창을 열고 다음 명령을 입력합니다.

Google_APPLICATION_Credentials=C:\사용자\사용자 이름\경로\수신처\File\filename.json

이렇게 하면 자격 증명에 안전하게 연결된 환경 변수가 생성됩니다. 이 변수는 Firebase에서 자신을 인증하기 위해 전화를 걸 때 인식하고 사용합니다.

(참고 - 창에 대한 명령입니다.mac/linux를 사용하는 경우 앞서 언급한 '인증 시작하기' 페이지로 이동하여 운영 체제에 적합한 명령을 얻습니다.)

여기 있습니다. 이제 문제가 해결되어야 합니다.추가 질문이나 문제가 있는 분은 아래에 자유롭게 의견을 주시면 최선을 다해 도와드리겠습니다.이런 실수로 꼼짝 못하는 게 얼마나 답답할 수 있는지 잘 알고 있습니다.

나는 이것이 최소한 누군가에게 도움이 되기를 바랍니다.해피 프로그래밍.C.Gadd

@Fernando 솔루션은 문제가 없는데도 사용하고 싶지 않습니다.

저는 prd와 non-prd 환경을 가지고 있습니다.firebase use 명령을 사용하여 변경 사항을 올바른 환경으로 푸시합니다.배포할 때 Firebase는 기본 서비스 계정을 사용합니다.또한 프로젝트 폴더나 Git repo에 키를 두고 싶지 않습니다.

제가 해결한 방법이 다른 사람들에게는 통하지 않을 수도 있지만, 여기서 공유하고 싶습니다.

제가 파이어베이스 프로젝트의 권한을 업데이트하여 시청자에게 편집자 권한을 부여했을 때 문제가 발생했습니다.저는 그 사람을 주인으로 삼고 편집자로 돌아갔습니다.사라졌어요.그것은 수정으로 정당화되지 않지만, 저에게는 효과가 있었고 저는 키를 다운로드할 필요가 없습니다.

serviceAccountKey.json 파일을 설정하는 대신 먼저 설정할 수 있습니다..env값을 입력하고 다음을 사용합니다.

import * as firebaseAdmin from "firebase-admin";

const adminCredentials = {
  credential: firebaseAdmin.credential.cert({
    projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
    clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
    privateKey: JSON.parse(process.env.FIREBASE_PRIVATE_KEY || ""),
  }),
  databaseURL: process.env.NEXT_PUBLIC_FIREBASE_DATABASE_URL,
};

if (!firebaseAdmin.apps.length) {
  firebaseAdmin.initializeApp(adminCredentials);
}

const firestore = firebaseAdmin.firestore();

이전 답변:
이것은 Firebase에서 알려진 버그입니다.여기에서 진행 상황을 확인하십시오. https://github.com/firebase/firebase-tools/issues/1940

그러나 이 문제를 해결할 수 있는 옵션은 거의 없습니다.

1 코드를 통해 명시적으로 전달됨

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

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

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://your-app.firebaseio.com"
});

하드 코딩을 권장하지 않습니다.서버에서 이 json 파일에 액세스할 수 없습니다.

2 GOOGLE_APPLICATION_Credentials를 통해 전달됨

다음과 같이 환경 변수를 설정하는 것이 좋습니다.

GOOGLE_APPLICATION_CREDENTIALS=path/to/serviceAccountKey.json

창의 경우: (json이 프로젝트의 루트 경로에 있다는 점을 고려합니다.

파워셸 사용:

$env:GOOGLE_APPLICATION_CREDENTIALS='serviceAccountKey.json'

NPM 스크립트 사용: (&& 앞에 공백 없음)

"serve": "set GOOGLE_APPLICATION_CREDENTIALS=serviceAccountKey.json&& npm run start",

이유로)cross-env작동하지 않음)

gcloud로 할 수 .
하고 gcloud sdk를 실행함으로써gcloud auth application-default login

4 GCP에서 실행할 경우 Compute Engine 메타데이터 API에서 사용 가능

Firebase 오류에서 동일한 문제가 발생했습니다. "기본 자격 증명을 가져올 수 없습니다."

그런 다음 Firebase 콘솔로 이동하고 서비스 계정 옵션을 찾을 수 있는 프로젝트 설정으로 이동합니다.여기를 클릭하면 프로젝트 설정 아래에 새 개인생성이 표시됩니다.프로젝트 언어의 코드를 복사하여 프로젝트 파일에 추가합니다.

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"); 준비는 여기까지입니다.

위의 것은 없습니다.다음을 수행할 수 있습니다.

파이어베이스 로그인 - 브라우저 로그인이 열립니다.

로그인하는 즉시 콘솔로 돌아가 다음을 실행합니다.

firebase init - 성공적으로 실행됩니다.

저도 같은 문제가 있었습니다.

  • Firebase = > 서비스 및 계정의 설정 페이지로 이동합니다.

  • 파이어베이스 설정 1. 파라미터 2.계정 3.파일을 다운로드하고 이름을 [admin.json](으)로 변경합니다.

  • 코드를 복사하여 붙여넣기

  • 관리자가 필요합니다.json' 및 붙여넣고 Firebase 배포를 실행합니다.

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

작동하기도 합니다.

클라우드 기능이 제대로 종료되지 않은 경우에도 이 오류가 발생할 수 있습니다.

클라우드 함수를 작성할 때마다 클라우드 함수 처리가 완료된 후 약속을 반환해야 합니다. 그러면 클라우드 함수는 프로세스가 완료되었음을 알 수 있습니다.

약속을 지키지 않으면 처리가 완료되기 전에 클라우드 기능이 종료될 가능성이 있습니다.

클라우드 기능을 종료하는 방법은 이를 참조할 수 있습니다.클라우드 기능 종료

프로젝트에 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>

구글 클라우드 기능이 실패하는 이유를 알아내려고 애쓰며 여기에 온 사람들을 위해:

오류: 기본 자격 증명을 로드할 수 없습니다.자세한 내용은 https://cloud.google.com/docs/authentication/getting-started 을 참조하십시오.Google Auth.getApplicationDefaultAsync에서

하지만 위의 어떤 것도 도움이 되지 않았습니다. 당신은 당신의 모든(?) 업데이트를 시도할 수 있습니다.@google/whatever종속성:npm i -E @google/firestore@latest그런 다음 다시 빌드하고, 배포하고, 다시 시도합니다.최근에 저에게 이런 일이 몇 번 일어났고 이것은 효과가 있었습니다.

저도 같은 문제가 있었습니다.이 문제를 해결하려면 다음 방법으로 노드 패키지를 업데이트하십시오.npm update사용자의 프로젝트 파일/파일/디렉토리 안에 있습니다.마지막으로 다시 배포합니다.

MacOS에서 저는 다음을 수행해야 했습니다.

export GOOGLE_APPLICATION_CREDENTIALS=/Users/myname/serviceAccountKey.json

로컬에서 실행 중인 함수 에뮬레이터가 프로덕션에서 실행 중인 Firebase 인증과 안전하게 통신할 수 없기 때문에 자격 증명 오류가 발생했습니다.

Google 클라우드 참조

계정 키를 다운로드하여 코드 내에서 사용한 후에도 여전히 동일한 문제 이벤트가 발생하는 사용자는 해당 계정 키가 함수 폴더 내에 있는지 확인하십시오.

문서에서 찾기 어려운 한 가지는 Firebase-admin SDK가 환경 변수가 지시할 만 에뮬레이터를 사용한다는 것입니다.여기에 설명된 일부 답변에 따라 서비스 계정 JSON 키를 사용하는 경우, Firebase-admin은 에뮬레이터에서 수행하는 다른 모든 작업이 에뮬레이터에 있더라도 에뮬레이터 버전이 아닌 prod(Google Cloud에서)와 대화합니다.

로컬 테스트에는 에뮬레이터를 사용하는 것이 좋으므로 Mac ~/.zshrc에서 환경 변수를 설정하는 방법은 다음과 같습니다.

export GCLOUD_PROJECT="your-project-id"
export FIRESTORE_EMULATOR_HOST=localhost:8080
export FIREBASE_AUTH_EMULATOR_HOST=localhost:9099
export FIREBASE_DATABASE_EMULATOR_HOST=localhost:9000

GCLOUD_PROJECT ID는 프로젝트 ID가 될 수 있지만, 잘 구성된 Firebase 프로젝트 ID인 한 모든 ID가 작동하므로, 동일한 환경 변수를 Firebase 에뮬레이터에서 모든 프로젝트를 테스트하는 데 사용할 수 있습니다.다른 솔루션을 사용하기 전에 먼저 에뮬레이터용으로 이러한 환경 변수를 설정하십시오.

또 다른 이상한 점은 Firebase Emulator입니다. 시작하려면 이러한 환경 변수를 설정해야 하지만 Firebase Emulator:exec이 자동으로 설정합니다.CI 시나리오에 있을 때는 exec을 선택하는 것이 더 좋지만 에뮬레이터가 계속 작동하고 실행되도록 코드를 작성할 때 테스트를 활성화할 때는 :start가 더 빠른 루프이므로 제대로 작동하려면 환경 변수가 필요합니다.이러한 변수를 환경 변수에 포함시키면 클라우드에 배포할 때 코드를 변경할 필요가 전혀 없습니다.

방금 이 문제를 해결했습니다.

firebase login

언급URL : https://stackoverflow.com/questions/58127896/error-could-not-load-the-default-credentials-firebase-function-to-firestore

반응형