【问题标题】:'auth/invalid-api-key' When Letting the Admin SDK discover a service account'auth/invalid-api-key' 让 Admin SDK 发现服务帐户时
【发布时间】:2020-05-19 07:08:10
【问题描述】:

在 Firebase Admin SDK 文档的不同页面中,例如 this page,建议:

如果您的代码部署在由 Google 管理的环境中,则 Admin SDK 可以尝试自动发现...服务帐户 为您的应用程序配置...要使用这些签名方法, 使用 Google Application Default 凭据初始化 SDK 并执行 未指定服务帐户 ID 字符串:admin.initializeApp();

执行此操作时,我收到以下错误消息:

[错误:您的 API 密钥无效,请检查您是否已复制它 正确。] 代码:'auth/invalid-api-key',消息:'您的 API 密钥 无效,请检查是否正确复制。'

请注意,当我在我的项目中手动下载并导入凭据和服务帐户 JSON 文件时,我不会收到此错误消息。

重现错误的详细信息: 1-我正在使用 Firebase CLI 在 Cloud Functions 上部署它。所以,基本上,我使用firebase deploy

2- 这是我的 Node.js 应用程序中的最少代码:

const admin = require("firebase-admin");
const config = require("./firebase-config");
admin.initializeApp();

const firebase = require("firebase");
firebase.initializeApp(config);

const functions = require("firebase-functions");
const express = require("express");
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.json());

const cors = require("cors");
app.use(cors());

app.get("/", Some_Function);

exports.api = functions.https.onRequest(app);

当我将firebase.initializeApp(config); 替换为firebase.initializeApp(); 时发生错误

【问题讨论】:

  • 在 firebase 函数中使用管理员时,您必须提供有效的凭据。 admin.initializeApp(config)
  • @ErnestasButa 您在哪个文档页面上找到了这些信息?
  • firebase.google.com/docs/admin/setup 也是我的错。如果您已设置环境变量和凭据 FIREBASE_CONFIG,则可以在不传递参数的情况下初始化 admin。
  • firebase.google.com/docs/admin/… 解释说:“注意:对于通过 Firebase CLI 部署的 Firebase 函数,FIREBASE_CONFIG 环境变量自动包含在 Cloud Functions 中。”那我为什么会得到那个错误呢?
  • 也许他们的意思是它作为“保留”变量存在?但是你仍然必须设置它。虽然这只是猜测。至少对我来说,没有参数是行不通的

标签: firebase google-cloud-platform google-cloud-functions firebase-admin api-key


【解决方案1】:

我试过了

  • dotenv 无效
  • process.env.PRIVATE_KEY.replace(/\\n/g, '\n') 无效

Step1:进入控制台生成新的服务账号文件

第二步:export GOOGLE_APPLICATION_CREDENTIALS='path/to/serviceAccount.json' (不管它在哪里,例如:'user/username/download/serviceAccount.json')

第三步:if(!admin.apps.length) admin.initializeApp();In the docs, either export the json object as param or no param with step 2

【讨论】:

    【解决方案2】:

    您正在尝试在服务器端环境中初始化 Firebase 客户端 SDK:

    const firebase = require("firebase");
    firebase.initializeApp(config);
    

    firebase-admin 相比,客户端 SDK 接受一组完全不同的凭据。您可以在 GCP 托管环境(例如 Cloud Functions、Cloud Run)中不带任何参数地初始化 firebase-admin,但同样不适用于 firebase。您需要提供从 Firebase 项目中获取的有效客户端应用配置。

    const admin = require('firebase-admin');
    admin.initializeApp(); // This is ok
    
    const firebase = require('firebase');
    firebase.initializeApp(); // This is wrong
    

    有关如何获取客户端应用配置的详细信息,请参阅https://firebase.google.com/docs/web/setup#config-object

    另外请注意,在 Functions 等环境中使用客户端 SDK 是相当不寻常的。我建议你重新考虑你的用例,看看你是否真的需要在你的函数中使用 firebase 客户端 SDK。

    【讨论】:

    • 感谢您的澄清。我在函数中使用 firebase 客户端 SDK 的原因是为了减少 firebase 客户端 SDK 添加到 JS 包中的过载,每次有人加载页面时都应该下载。此外,对于一个动态网站,我无法完全依赖 Firestore 规则,我需要在服务器端检查用户的身份验证,以根据他们之前与 Web 应用程序的交互生成适当的响应。有没有更有效的方法来做到这一点?如果是的话,如果你让我知道,我将不胜感激。
    • 至少对于第二个问题,您可以查看ID token verification 甚至session cookies。对于页面加载问题,我建议运行一些实际测试以查看加载客户端 SDK 是否确实会导致页面加载时间明显延迟。通过在服务器端执行此操作,您将错过许多内置在客户端 SDK 中的巧妙功能。
    • 我会浏览链接并进行比较。谢谢你告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2017-07-01
    • 2021-09-05
    • 2019-01-15
    • 1970-01-01
    • 2022-01-14
    • 2022-07-02
    相关资源
    最近更新 更多