使用 firebase-admin 在 Google 云环境之外验证为服务帐户

Authenticating as a service account outside of the Google Cloud environment using firebase-admin

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

这是我遇到的错误:

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.

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

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

at async GrpcClient._getCredentials (/var/task/node_modules/google-gax/build/src/grpc.js:109:24)

at async GrpcClient.createStub (/var/task/node_modules/google-gax/build/src/grpc.js:252:23)

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

它具有所有必要的角色。我创建了一个 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

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

运行我的代码使用的资源是 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
});

另请参阅: