无法分配 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 配置文件正确初始化您的应用程序。
一个简单的修复方法是:
- 转到https://console.cloud.google.com/iam-admin/iam?project=PROJECT_NAME
- 编辑您的默认服务帐户。
- 添加角色 Service Account Token Creator
几分钟后,您的项目将能够创建签名令牌。
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 配置文件正确初始化您的应用程序。
一个简单的修复方法是:
- 转到https://console.cloud.google.com/iam-admin/iam?project=PROJECT_NAME
- 编辑您的默认服务帐户。
- 添加角色 Service Account Token Creator
几分钟后,您的项目将能够创建签名令牌。