资源上的权限“iam.serviceAccounts.getAccessToken”被拒绝

问题描述 投票:0回答:2

在 GCP 控制台中,我创建了一个服务帐户并为其分配了一个自定义角色,该角色具有以下权限,请注意粗体权限:

  • iam.serviceAccounts.getAccessToken
  • 存储.buckets.get
  • 存储.multipartUploads.abort
  • 存储.multipartUploads.create
  • 存储.multipartUploads.list
  • 存储.multipartUploads.listParts
  • 存储.对象.创建
  • 存储.对象.删除
  • 存储.对象.列表

在我的工作站上,我按照说明使用 gCloud CLI 通过应用程序默认凭据 (ADC) 进行身份验证。

这是我的委托人,其中包含来自 IAM 的“名称”和“角色”列:

IAM screen capture of principal

./gcloud auth application-default login --impersonate-service-account=principle_email_address_here

这是我的参考测试函数:

export async function createBucket(
  projectId: string,
  tenantExtId: string
): Promise<undefined> {
  const storage = new Storage({
    projectId: projectId
  });

  const result = await storage.createBucket(tenantExtId);
  console.dir(result);
  return;
}

我有一个 Jest 单元测试,尝试验证存储桶的创建。它失败并显示以下消息:

#createBucket › creates a bucket name
    
Could not refresh access token: PERMISSION_DENIED: unable to impersonate: Permission 'iam.serviceAccounts.getAccessToken' denied on resource (or it may not exist).

我多次查看了 GCP 文档和 SO 条目,但仍然不知道我做错了什么。这应该会导致创建一个新的存储桶名称。

node.js permissions google-cloud-storage gcloud google-cloud-iam
2个回答
2
投票

您,X 人,正在尝试冒充服务帐户。您必须授予自己(即 X 人,即您的 gcloud 用户帐户)服务帐户获取访问令牌权限。你还没有这样做。您所做的就是将该权限授予服务帐户本身。


0
投票

确保我模拟的服务帐户也具有

Service Account Token Creator
角色是除了@NoCommandLine的答案之外对我有用的解决方案(参见文档):

您必须在您要模拟的服务账户上拥有服务账户令牌创建者 (roles/iam.serviceAccountTokenCreator) IAM 角色。有关更多信息,请参阅必需角色。

上面写着:

为了确保委托人拥有模拟服务账户的必要权限,请要求您的管理员向委托人授予服务账户上的服务账户令牌创建者 (roles/iam.serviceAccountTokenCreator) IAM 角色。

© www.soinside.com 2019 - 2024. All rights reserved.