【问题标题】:How can I "admin.initializeApp();" no arguments in local我怎样才能“admin.initializeApp();”本地没有参数
【发布时间】:2019-07-22 07:18:18
【问题描述】:

我总是感谢您的帮助。

我想在本地和生产环境中编写代码 admin.initializeApp();

当我将功能部署到没有增强功能的生产环境时,它可以工作。 但是在本地,它需要我这样写:

const serviceAccount = require("/home/yhirochick/development/ServiceAccountKey.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://xxxx.firebaseio.com/"
});

在官方文档中,它说当您在不带参数的情况下初始化 Firebase Admin SDK 时会自动应用配置

但是当我在本地执行命令firebase serve --only functions 并且某些调用邮递员的某些请求时会产生以下错误:

 [2019-07-22T06:45:26.227Z]  @firebase/database: FIREBASE WARNING: Provided 
authentication credentials for the app named "[DEFAULT]" are invalid. This
 usually indicates your app was not initialized correctly. Make sure the
 "credential" property provided to initializeApp() is authorized to access the
 specified "databaseURL" and is from the correct project.

我想知道如何“admin.initializeApp();”本地没有参数。

【问题讨论】:

  • 在部署到 Cloud Functions 时,不应使用类似的本地文件路径。该服务无法知道您的本地文件路径。

标签: firebase google-cloud-platform firebase-cli


【解决方案1】:

我也解决了这个问题,我认为目前的本地测试场景在官方文档中没有得到很好的解释。但这里有一个解决方案:

对于您的本地环境,您需要下载 firebase 项目 firebase 服务帐户 json 文件(在项目设置 -> 服务帐户下的 firebase 控制台中找到)并设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向文件:

# Linux/MACOS version
export GOOGLE_APPLICATION_CREDENTIALS="[PATH_TO_YOUR_SERVICE_ACCOUNT_FILE]"

Read more here, also on how to do this on Windows

现在您可以在本地使用admin.initializeApp()(不带参数)。

这种方法的一个可能的缺点是,您必须在启动 firebase 模拟器之前每次设置环境变量,因为变量会结束会话时删除。

自动化...

您可以通过将export ... 命令与启动模拟器的命令捆绑在一起来自动化它。您可以通过在package.jsonscripts 部分添加一个条目来执行此操作,例如:

"local": "export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_YOUR_SERVICE_ACCOUNT_FILE]' && firebase emulators:start --only functions"

那么,在本例中,您只需输入npm run local

替代方案:仅在本地环境中提供显式凭据

看这个例子:https://stackoverflow.com/a/47517466/1269280

它基本上使用运行时节点环境变量来区分本地和生产环境,然后使用仅在本地环境中提供凭据的显式方式。

这是我首选的做事方式,因为我认为它更便携。它允许我将服务帐户文件放在我的代码库中,而不是处理它的绝对文件路径。

如果您执行此类操作,请记住从您的存储库中排除服务帐户文件! (它包含敏感信息)。

背景:生产和本地服务帐户发现的区别

admin.initializeApp()(不带参数)在生产中开箱即用的原因是,当您部署到生产环境(即 Firebase 函数)时,代码会以 ' Google 托管环境”。在 Cloud Functions、Cloud Run、App Engine 等 Google 托管环境中,管理员 SDK 可以访问您的应用程序默认服务帐户(您在上面下载的那个),并且在没有凭据时使用该帐户指定的。

这是 Google Clouds Application Default Credentials (ADC) strategy 的一部分,它也适用于 firebase 函数。

现在,您的 本地 环境不是“Google 托管环境”,因此它无权访问默认服务帐户凭据。对于谷歌云,您的本地机器只是试图访问您的私有 Firebase 资源的外部服务器。因此,您需要通过上述方式之一提供您的服务帐户凭据。

在我知道这一点之前,我认为因为我已经通过我的终端(即firebase login)登录到 firebase 并且能够将代码部署到 firebase,所以 firebase 模拟器也将拥有 firebase admin sdk 的必要凭据,但事实并非如此。

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2018-09-03
    • 2020-04-06
    • 2018-07-02
    • 2017-02-02
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多