Node.js &引用;呼叫方没有权限”;尝试使用Firebase Admin SDK创建自定义令牌 错误

Node.js &引用;呼叫方没有权限”;尝试使用Firebase Admin SDK创建自定义令牌 错误,node.js,firebase,firebase-authentication,google-kubernetes-engine,firebase-admin,Node.js,Firebase,Firebase Authentication,Google Kubernetes Engine,Firebase Admin,调用admin.auth().createCustomToken()时,我收到以下错误: 错误:调用方没有权限;请参阅https://firebase.google.com/docs/auth/admin/create-custom-tokens 有关如何使用和排除此功能故障的详细信息。 提供的文档使我相信,我正在初始化Firebase Admin SDK的服务帐户没有足够的权限。我不相信是这样的,所以我想问一下,看看我是否错过了什么 配置 Firebase Admin SDK在后端初始化,如下

调用
admin.auth().createCustomToken()
时,我收到以下错误:

错误:调用方没有权限;请参阅https://firebase.google.com/docs/auth/admin/create-custom-tokens 有关如何使用和排除此功能故障的详细信息。

提供的文档使我相信,我正在初始化Firebase Admin SDK的服务帐户没有足够的权限。我不相信是这样的,所以我想问一下,看看我是否错过了什么

配置 Firebase Admin SDK在后端初始化,如下所示:

admin.initializeApp({
  serviceAccountId: 'firebase-adminsdk-xxxxx@my-project-id.iam.gserviceaccount.com'
});
从技术上讲,该值是从一个环境变量引用的,但我已经确认该值是正确的

正在使用的服务帐户具有以下角色:

roles/firebase.sdkAdminServiceAgent
roles/iam.serviceAccountTokenCreator
根据文档,创建自定义令牌所需的权限为
iam.servicecomports.signBlob
。根据此输出,此权限是iam.serviceAccountTokenCreator角色的一部分:

❯ gcloud beta iam roles describe roles/iam.serviceAccountTokenCreator
description: Impersonate service accounts (create OAuth2 access tokens, sign blobs
  or JWTs, etc).
etag: AA==
includedPermissions:
- iam.serviceAccounts.get
- iam.serviceAccounts.getAccessToken
- iam.serviceAccounts.getOpenIdToken
- iam.serviceAccounts.implicitDelegation
- iam.serviceAccounts.list
- iam.serviceAccounts.signBlob
- iam.serviceAccounts.signJwt
- resourcemanager.projects.get
- resourcemanager.projects.list
name: roles/iam.serviceAccountTokenCreator
stage: GA
title: Service Account Token Creator
最后,出错的代码如下所示:

try {
  const loginToken = await admin.auth().createCustomToken(uid);
  return response(200).json({ loginToken });
} catch (err) {
  ...
}
uid来自通过GoogleUser凭据登录用户-提供的uid被确认为准确无误,并且当引用同一服务帐户的JSON密钥文件时,此流在本地工作

服务器正在GKE上运行,以防可能是群集权限错误

任何帮助都将不胜感激

编辑-已解决
Hiranya的回答起到了关键作用——K8s部署配置了一个服务帐户,其最初目的只是启用云SQL代理。将serviceAccountTokenCreator角色赋予此服务帐户解决了此问题。

您需要确保SDK获得授权的服务帐户(而不是指定为
serviceAccountId
)具有令牌创建者角色。这是Google应用程序默认凭据自动发现的服务帐户。对于云功能,这是名为
{project name}@appspot.gserviceaccount.com
的服务帐户。您需要计算出GKE的等效服务帐户,并授予它令牌创建者角色。

对于我来说,只有在我开始尝试为每个成员添加“服务帐户令牌创建者”角色时,它才起作用。在给我自己(所有者)添加了同样对我有用的@AlissonNunes之后,我开始工作了!非常感谢