Error: Could not load the default credentials (Firebase function to firestore)
Error: Could not load the default credentials (Firebase function to firestore)
我正在尝试为 Firebase Cloud Functions 编写一个 onCall 函数,该函数在 firestore 数据库上执行高级查询任务(即根据 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
我不知道这个问题是从哪里来的,也不知道如何解决。
有帮助吗?
此致。
我首先解决这个问题的方法是将我的 firebase admin sdk 密钥添加到我的项目中。
我在
下载了它
然后在 admin.initializeApp();
我改为:
admin.initializeApp({
credential: admin.credential.cert(require('../keys/admin.json'))
});
我的文件夹结构是
├── key
│ ├── admin.json
├── src
│ ├── index.ts
HOWEVER,一种更好的做法和更安全的方法,正如一些人已经提到的:
您可以使用环境变量来存储您的凭据,这样您就不会将其提交到存储库,例如 Github,使其更安全,不会出现安全漏洞,并且不会对其进行硬编码。
根据您的项目和部署位置,可以采用不同的方法。
有很多关于如何创建和访问环境变量的教程 (like this one),但您可以像下面的示例一样使用它的名称:
GOOGLE_APPLICATION_CREDENTIALS="/home/admin.json"
我有同样的错误"Could not load the default credentials"。
使用 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'
});
请参阅下面 @Fernando Rocha 的回答以访问您的 firebase 项目的帐户设置。
另一种选择是 set the service account key in an environmental variable 而不是通过调用 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"
后记:更好的选择可能是use the local emulator suite。
我运行自己也遇到了同样的问题。有时该函数可以工作,但很多时候它会通过 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(..)...
...
}
希望对您有所帮助!
@aldobaie 的回答帮助我弄清楚了我的用例发生了什么。对于那些不想在所有调用中添加 async/await 的人,请记住 firestore 调用 return 承诺,因此在它们前面加上 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)
我不想使用@Fernando 解决方案,即使没有任何问题。
我有珠三角和非珠三角环境。我使用 firebase use 命令将更改推送到正确的环境。当我部署时,firebase 使用默认服务帐户。此外,我不想将密钥放在项目文件夹或我的 git 存储库中。
我解决的方法可能对其他人不起作用,但想在这里分享。
当我更新 firebase 项目的权限以授予查看者编辑权限时,我遇到了这个问题。我让那个人成为所有者并回滚到编辑器。它走了。它不能作为修复程序,但对我有用,我不必下载密钥。
我在 firebase 中遇到了同样的问题错误:"Could not get default credentials."
然后转到 firebase 控制台 并转到项目设置,在那里你可以找到 Service Accounts 选项。单击此处,您将在项目设置下看到 生成新私钥。
复制项目语言的代码并将其添加到项目文件中。
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 服务帐户下载到您的项目中并像这样引用它:
<code>
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "<database-url>"
});
</code>
对于那些从 serp 来到这里试图弄清楚为什么他们的 google 云功能失败的人:
Error: Could not load the default credentials. Browse to
https://cloud.google.com/docs/authentication/getting-started for more
information. at GoogleAuth.getApplicationDefaultAsync
但上面的 none 有帮助,您可以尝试更新所有(?)您的 @google/whatever
依赖项:
npm i -E @google/firestore@latest
。然后重建、部署,再试一次。 最近在我身上发生了几次,这很有效。
我刚遇到同样的问题。要解决它,只需在 project-dir/functions/ 目录中通过 npm update
更新节点包。最后再次部署。
None 以上。
您可以:
firebase 登录 - 它将打开浏览器登录
登录后立即返回控制台并运行:
firebase init - 它会运行成功。
在 MacOS 上,我必须执行以下操作:
export GOOGLE_APPLICATION_CREDENTIALS=/Users/myname/serviceAccountKey.json
我收到凭据错误,因为本地 运行 函数模拟器无法在生产环境中安全地与 firebase auth 运行 对话。
云功能未正确终止时也会出现此错误。
无论何时编写云函数,请确保在云函数处理结束后return做出承诺,以便云函数知道您的过程已完成。
如果您不return承诺,那么您的云功能可能会在处理完成之前终止。
您可以参考这里了解如何终止云功能。
Terminate cloud functions
我遇到了同样的问题。
进入 Firebase 的设置页面 => 服务和帐户。
Firebase 设置 1. 参数 2. 账户 3. 下载文件并重命名 [admin.json]
- 复制代码并粘贴
- 需要 'admin.json' 和粘贴,以及 运行 Firebase 部署。
admin.initializeApp(functions.config().firebase);
也有效。
好吧,所以我也遇到了这个错误,并且花了几天时间沮丧地浏览了多个网站、文章、视频等,试图找出这个问题的原因,这样我自己就可以得到一个合适的答案以及所有正在挣扎的人。
此主题中已有此问题的答案。但是,我尝试关注其中的大多数都无济于事。有些有安全问题,有些则太模糊,无法遵循。我决定 post 一个彻底的答案,它也解决了如果你遵循其他一些答案会遇到的安全问题。
好了,现在我已经解决了这个问题,让我们开始吧!
首先你需要去这个 link - Getting started with authentication
您应该会在屏幕中央看到这个 -
接下来,单击我标记为绿色的按钮。这会将您带到创建服务帐户密钥页面。
您应该会看到与下图类似的屏幕 -
对于服务帐户选项,select新服务帐户。
为您的服务帐户创建一个名称。这个不重要,随便起什么名字吧
对于角色选项 select 项目 -> 所有者
最后,select JSON 键类型选项,然后点击创建。
这应该创建并下载一个 .json 文件。将此文件放在智能且安全的地方。我在项目的根目录中创建了一个名为 'credentials' 的文件夹并将其放置在那里。
我还将该文件重命名为更具可读性的名称。虽然这不是必需的,但遵循良好的 file/folder 命名和结构实践很重要,我建议您将其重命名为更易读的名称。
(重要的是要注意这个文件是个人的,不应该包含在任何githubrepositories/firebaseproduction/etc中。这个文件是给你和你的一个人!)
接下来打开命令提示符 window 并输入以下命令 -
设置GOOGLE_APPLICATION_CREDENTIALS=C:\Users\Username\Path\To\File\filename.json
这将创建一个环境变量,该变量 link 安全地添加到您的凭据中,当您调用以验证自己时,firebase 将识别并使用该凭据。
(注意 - 这是 windows 的命令。如果您使用 mac/linux 转到 'Getting started with Authentication'前面提到的页面以获取适用于您的操作系统的命令)
好了,问题现在应该已经解决了。如果有人有任何进一步的问题或问题,请随时在下面发表评论,我会尽力帮助您。我知道遇到这样的错误是多么令人沮丧。
我希望这至少对某些人有所帮助。快乐编程。
C.Gadd
您可以先从文件中设置 .env
值,然后使用这些值,而不是设置 serviceAccountKey.json 文件:
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
对于windows:(考虑到json在您项目的根路径中。
使用 powershell:
$env:GOOGLE_APPLICATION_CREDENTIALS='serviceAccountKey.json'
使用 NPM 脚本:(注意在 && 之前没有 space)
"serve": "set GOOGLE_APPLICATION_CREDENTIALS=serviceAccountKey.json&& npm run start",
(由于某种原因 cross-env
没有工作)
3 由于 gcloud
,可在众所周知的文件系统路径中使用
通过安装 gcloud sdk 和 运行 gcloud auth application-default login
4 在 GCP
上 运行 时可从 Compute Engine 元数据 API 获得
对于那些在下载帐户密钥并在您的代码中使用它后仍然遇到相同问题事件的人,请确保它在您的函数文件夹中。
在文档中很难找到的一件事是 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,但显然任何 id 都可以,只要它是格式正确的 Firebase 项目 id,因此这些相同的环境变量可用于测试您的所有项目在 Firebase 模拟器上。在尝试任何其他解决方案之前,先尝试设置这些环境变量以供模拟器使用。
另一个奇怪的地方是 firebase emulators:start 需要设置这些环境变量,但是 firebase emulators:exec 会自动设置它们。当您处于 CI 场景时 :exec 是更好的选择,但是当您在编写代码时主动 运行 测试让模拟器保持运行并且 运行 :start 是一个更快的循环并且您它需要环境变量才能正常工作。通过将这些放在环境变量中,您的代码在部署到云端时根本不需要更改。
我正在尝试为 Firebase Cloud Functions 编写一个 onCall 函数,该函数在 firestore 数据库上执行高级查询任务(即根据 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
我不知道这个问题是从哪里来的,也不知道如何解决。 有帮助吗?
此致。
我首先解决这个问题的方法是将我的 firebase admin sdk 密钥添加到我的项目中。
我在
下载了它然后在 admin.initializeApp();
我改为:
admin.initializeApp({
credential: admin.credential.cert(require('../keys/admin.json'))
});
我的文件夹结构是
├── key
│ ├── admin.json
├── src
│ ├── index.ts
HOWEVER,一种更好的做法和更安全的方法,正如一些人已经提到的: 您可以使用环境变量来存储您的凭据,这样您就不会将其提交到存储库,例如 Github,使其更安全,不会出现安全漏洞,并且不会对其进行硬编码。
根据您的项目和部署位置,可以采用不同的方法。
有很多关于如何创建和访问环境变量的教程 (like this one),但您可以像下面的示例一样使用它的名称:
GOOGLE_APPLICATION_CREDENTIALS="/home/admin.json"
我有同样的错误"Could not load the default credentials"。
使用 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'
});
请参阅下面 @Fernando Rocha 的回答以访问您的 firebase 项目的帐户设置。
另一种选择是 set the service account key in an environmental variable 而不是通过调用 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"
后记:更好的选择可能是use the local emulator suite。
我运行自己也遇到了同样的问题。有时该函数可以工作,但很多时候它会通过 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(..)...
...
}
希望对您有所帮助!
@aldobaie 的回答帮助我弄清楚了我的用例发生了什么。对于那些不想在所有调用中添加 async/await 的人,请记住 firestore 调用 return 承诺,因此在它们前面加上 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)
我不想使用@Fernando 解决方案,即使没有任何问题。
我有珠三角和非珠三角环境。我使用 firebase use 命令将更改推送到正确的环境。当我部署时,firebase 使用默认服务帐户。此外,我不想将密钥放在项目文件夹或我的 git 存储库中。
我解决的方法可能对其他人不起作用,但想在这里分享。
当我更新 firebase 项目的权限以授予查看者编辑权限时,我遇到了这个问题。我让那个人成为所有者并回滚到编辑器。它走了。它不能作为修复程序,但对我有用,我不必下载密钥。
我在 firebase 中遇到了同样的问题错误:"Could not get default credentials."
然后转到 firebase 控制台 并转到项目设置,在那里你可以找到 Service Accounts 选项。单击此处,您将在项目设置下看到 生成新私钥。 复制项目语言的代码并将其添加到项目文件中。
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 服务帐户下载到您的项目中并像这样引用它:
<code>
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "<database-url>"
});
</code>
对于那些从 serp 来到这里试图弄清楚为什么他们的 google 云功能失败的人:
Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information. at GoogleAuth.getApplicationDefaultAsync
但上面的 none 有帮助,您可以尝试更新所有(?)您的 @google/whatever
依赖项:
npm i -E @google/firestore@latest
。然后重建、部署,再试一次。 最近在我身上发生了几次,这很有效。
我刚遇到同样的问题。要解决它,只需在 project-dir/functions/ 目录中通过 npm update
更新节点包。最后再次部署。
None 以上。 您可以:
firebase 登录 - 它将打开浏览器登录
登录后立即返回控制台并运行:
firebase init - 它会运行成功。
在 MacOS 上,我必须执行以下操作:
export GOOGLE_APPLICATION_CREDENTIALS=/Users/myname/serviceAccountKey.json
我收到凭据错误,因为本地 运行 函数模拟器无法在生产环境中安全地与 firebase auth 运行 对话。
云功能未正确终止时也会出现此错误。
无论何时编写云函数,请确保在云函数处理结束后return做出承诺,以便云函数知道您的过程已完成。
如果您不return承诺,那么您的云功能可能会在处理完成之前终止。
您可以参考这里了解如何终止云功能。 Terminate cloud functions
我遇到了同样的问题。
进入 Firebase 的设置页面 => 服务和帐户。
Firebase 设置 1. 参数 2. 账户 3. 下载文件并重命名 [admin.json]
- 复制代码并粘贴
- 需要 'admin.json' 和粘贴,以及 运行 Firebase 部署。
admin.initializeApp(functions.config().firebase);
也有效。
好吧,所以我也遇到了这个错误,并且花了几天时间沮丧地浏览了多个网站、文章、视频等,试图找出这个问题的原因,这样我自己就可以得到一个合适的答案以及所有正在挣扎的人。
此主题中已有此问题的答案。但是,我尝试关注其中的大多数都无济于事。有些有安全问题,有些则太模糊,无法遵循。我决定 post 一个彻底的答案,它也解决了如果你遵循其他一些答案会遇到的安全问题。
好了,现在我已经解决了这个问题,让我们开始吧!
首先你需要去这个 link - Getting started with authentication
您应该会在屏幕中央看到这个 -
您应该会看到与下图类似的屏幕 -
对于服务帐户选项,select新服务帐户。
为您的服务帐户创建一个名称。这个不重要,随便起什么名字吧
对于角色选项 select 项目 -> 所有者
最后,select JSON 键类型选项,然后点击创建。
这应该创建并下载一个 .json 文件。将此文件放在智能且安全的地方。我在项目的根目录中创建了一个名为 'credentials' 的文件夹并将其放置在那里。
我还将该文件重命名为更具可读性的名称。虽然这不是必需的,但遵循良好的 file/folder 命名和结构实践很重要,我建议您将其重命名为更易读的名称。
(重要的是要注意这个文件是个人的,不应该包含在任何githubrepositories/firebaseproduction/etc中。这个文件是给你和你的一个人!)
接下来打开命令提示符 window 并输入以下命令 -
设置GOOGLE_APPLICATION_CREDENTIALS=C:\Users\Username\Path\To\File\filename.json
这将创建一个环境变量,该变量 link 安全地添加到您的凭据中,当您调用以验证自己时,firebase 将识别并使用该凭据。
(注意 - 这是 windows 的命令。如果您使用 mac/linux 转到 'Getting started with Authentication'前面提到的页面以获取适用于您的操作系统的命令)
好了,问题现在应该已经解决了。如果有人有任何进一步的问题或问题,请随时在下面发表评论,我会尽力帮助您。我知道遇到这样的错误是多么令人沮丧。
我希望这至少对某些人有所帮助。快乐编程。 C.Gadd
您可以先从文件中设置 .env
值,然后使用这些值,而不是设置 serviceAccountKey.json 文件:
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
对于windows:(考虑到json在您项目的根路径中。
使用 powershell:
$env:GOOGLE_APPLICATION_CREDENTIALS='serviceAccountKey.json'
使用 NPM 脚本:(注意在 && 之前没有 space)
"serve": "set GOOGLE_APPLICATION_CREDENTIALS=serviceAccountKey.json&& npm run start",
(由于某种原因 cross-env
没有工作)
3 由于 gcloud
,可在众所周知的文件系统路径中使用
通过安装 gcloud sdk 和 运行 gcloud auth application-default login
4 在 GCP
上 运行 时可从 Compute Engine 元数据 API 获得对于那些在下载帐户密钥并在您的代码中使用它后仍然遇到相同问题事件的人,请确保它在您的函数文件夹中。
在文档中很难找到的一件事是 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,但显然任何 id 都可以,只要它是格式正确的 Firebase 项目 id,因此这些相同的环境变量可用于测试您的所有项目在 Firebase 模拟器上。在尝试任何其他解决方案之前,先尝试设置这些环境变量以供模拟器使用。
另一个奇怪的地方是 firebase emulators:start 需要设置这些环境变量,但是 firebase emulators:exec 会自动设置它们。当您处于 CI 场景时 :exec 是更好的选择,但是当您在编写代码时主动 运行 测试让模拟器保持运行并且 运行 :start 是一个更快的循环并且您它需要环境变量才能正常工作。通过将这些放在环境变量中,您的代码在部署到云端时根本不需要更改。