无法分配 iam.serviceAccounts.signBlob 权限

Unable to assign iam.serviceAccounts.signBlob permission

TLDR;我在向服务帐户分配 IAM 权限时遇到问题。

我正在构建一个涉及使用 firebase Auth 生成自定义令牌的测试。当我点击:

  const token = await admin.auth().createCustomToken('test', {
    isAdmin: true,
  })

抛出以下错误

Permission iam.serviceAccounts.signBlob is required to perform
this operation on service account 
projects/-/serviceAccounts/dashboard@appspot.gserviceaccount.com.;
Please refer to 
https://firebase.google.com/docs/auth/admin/create-custom-tokens
for more details on how to use and troubleshoot this feature

referenced documentation 中它说要将 Service Account Token Creator 角色添加到服务帐户。我已经添加了该角色(以及尝试过服务帐户管理员无济于事。

当我 运行 时,我可以验证我的权限似乎设置正确 gcloud projects get-iam-policy project 我可以看到我的服务帐户附加到所需的角色

- members:
  - serviceAccount:dashboard@appspot.gserviceaccount.com
  role: roles/iam.serviceAccountTokenCreator

但是,如果我查看那个特定的服务帐户,它似乎显示为空,这符合我的错误:

gcloud iam service-accounts get-iam-policy dashboard@appspot.gserviceaccount.com
etag: ACAB

我认为导致我的服务帐户权限显示为空白的原因是罪魁祸首,但我不确定在何处进一步调试。在我看来,唯一的区别是一个命令被调用,其中有一个项目,但我用项目 ID 初始化了我的 firebase 应用程序,并用 (firebase-admin).apps[0].options 验证了它,所以它似乎是一个死胡同。

服务帐户的 sign 功能需要 iam.serviceAccounts.signBlob 权限。此权限包含在服务帐户令牌角色中 roles/iam.serviceAccountTokenCreator

您可以在 "project" 级别或 "service account" 级别分配此角色。这就是您看到不同结果的原因。在项目级别分配角色会影响所有服务帐户的权限。在服务帐户上分配角色只会影响该服务帐户。

您的问题的关键是调用者在服务帐户 dashboard@appspot.gserviceaccount.com 上没有此角色。您已授予服务帐户权限,而不是调用者。查看用于设置 Firebase SDK 的服务帐户的代码。

Firebase 在其文档中提到了这个错误:

https://firebase.google.com/docs/auth/admin/create-custom-tokens#failed_to_determine_service_account

您必须通过 JSON 配置文件正确初始化您的应用程序。

一个简单的修复方法是:

  1. 转到https://console.cloud.google.com/iam-admin/iam?project=PROJECT_NAME
  2. 编辑您的默认服务帐户。
  3. 添加角色 Service Account Token Creator

几分钟后,您的项目将能够创建签名令牌。