使用 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
- 来自上图:
- 我没有设置任何
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
});
另请参阅:
我在 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
- 来自上图:
- 我没有设置任何
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
});
另请参阅: