微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 firebase-admin 在 Google Cloud 环境之外对服务帐号进行身份验证

如何解决使用 firebase-admin 在 Google Cloud 环境之外对服务帐号进行身份验证

我在 Vercel 上托管的 Next.js 应用程序中作为服务帐户进行身份验证时遇到问题。我的代码在我的开发环境中运行良好,但是当我尝试在 Vercel Node.js v14 环境中运行它时失败并显示以下错误消息。我猜它在我的本地机器上运行,因为我使用我的电子邮件(项目所有者)登录 gcloud

这是我得到的错误

错误:无法加载认凭据。浏览到 https://cloud.google.com/docs/authentication/getting-started 了解更多信息。

在 GoogleAuth.getApplicationDefaultAsync (/var/task/node_modules/google-auth-library/build/src/auth/googleauth.js:173:19) 在 processticksAndRejections (internal/process/task_queues.js:97:5)

在异步 GoogleAuth.getClient (/var/task/node_modules/google-auth-library/build/src/auth/googleauth.js:551:17)

在异步 Grpcclient._getCredentials (/var/task/node_modules/google-gax/build/src/grpc.js:109:24)

在异步 Grpcclient.createStub (/var/task/node_modules/google-gax/build/src/grpc.js:252:23)

我创建了以下服务帐户以将其与我的 Next.js API 一起使用。

enter image description here

它具有所有必要的角色。我已经创建了一个 JSON 密钥并下载了它。

我正在使用 firebase-admin,这是我初始化它的方式:

export const initializefirebaseAdmin = (): FirebaseAdmin => {
  const account = getServiceAccount();   // THIS IS THE SERVICE ACCOUNT JSON KEY (ALREADY PARSED AS AN OBJECT)
  if (!admin.apps.length) {
    admin.initializeApp({
      credential: admin.credential.cert(account),});
  }
  return admin;
};

这就是我认为正在发生的事情:

来自:https://cloud.google.com/docs/authentication/production#automatically

enter image description here

  • 从上图:
  • 我没有设置任何 GOOGLE_APPLICATION_CREDENTIALS 环境变量
  • 所以我应该排在第 2 位。它会“尝试使用附加到正在运行您的代码的资源的服务帐户。”
  • 它显然失败了,我收到了错误

但是它指的是哪个资源?哪个代码

运行我的代码的资源是 Firebase Admin?我没有正确初始化它吗?

解决方法

此代码应该可以验证 firebase-admin 包:

export const initializeFirebaseAdmin = (): FirebaseAdmin => {
  const account = getServiceAccount();   // THIS IS THE SERVICE ACCOUNT JSON KEY (ALREADY PARSED AS AN OBJECT)
  if (!admin.apps.length) {
    admin.initializeApp({
      credential: admin.credential.cert(account),});
  }
  return admin;
};

我的问题与我使用从 firebase-admin 包公开的客户端有关,该客户端无法访问主包的身份验证。所以我也需要将凭据传递给它。喜欢:

const client = new admin.firestore.v1.FirestoreAdminClient({
    credentials: SERVICE_ACCOUNT as CredentialBody    // <<<<<< THIS IS THE SERVICE ACCOUNT JSON KEY
});

另请参阅:Trying to export backup via admin.firestore.v1.FirestoreAdminClient on a Next.js API route. Error: Could not load the default credentials

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?