为google服务帐户获取signnedjwt令牌



我正在尝试为google服务帐户生成signed djwt令牌

now = int(time.time())
expires = now + 900  # 15 mins in seconds, can't be longer.
payload = {
'iat': now,
'exp': expires,
'sub': 'somekey@someproject.iam.gserviceaccount.com',
'aud': 'aud'
}
body = {'payload': json.dumps(payload)}
name = 'projects/someproject/serviceAccounts/somekey@someproject.iam.gserviceaccount.com'
iam = googleapiclient.discovery.build('iam', 'v1', credentials=credentials)
request = iam.projects().serviceAccounts().signJwt(name=name, body=body)
resp = request.execute()
jwt = resp['signedJwt']

我面临的问题是关于证书如果我使用

credentials = service_account.Credentials.from_service_account_info(gcp_json_credentials_dict)

工作好。

但是我正在尝试使用默认的服务帐户

credentials, your_project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])

出现以下错误-

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://iam.googleapis.com/v1/projects/someproject/serviceAccounts/somekey@someproject.iam.gserviceaccount.com:signJwt?alt=json returned "Permission iam.serviceAccounts.signJwt is required to perform this operation on service account

首先,我将尝试解释为什么您会得到错误:

permission iam.serviceAccounts.signJwt需要对服务帐户执行此操作.

A)您的代码在使用默认服务帐户的计算服务上运行。我将其命名为Identity-1.

B)您的代码正在模拟身份somekey@someproject.iam.gserviceaccount.com. 我将其命名为Identity-2

.你的代码需要权限来使用Identity-1的凭据以及冒充Identity-2的权限.

第1部分:

当您为计算服务使用默认服务帐户或将服务帐户分配给计算服务时,会产生两种形式的权限控制。主控件是IAM角色分配给服务帐户。限制符是为计算服务设置的OAuth范围。

OAuth作用域不授予权限,OAuth作用域限制已经通过IAM角色授予服务帐户的权限。这一点很重要,我看到很多配置都不正确。我建议使用计算引擎访问范围设置为允许完全访问所有云api. 修改/管理Compute Engine的业务帐户的IAM角色

第2部分:

为了模拟另一个身份,在您的示例中identity -1正在冒充Identity-2,你的代码必须有这样做的权利。有两种类型的身份可以被模拟:a)服务帐户;B)用户身份。在您的情况下,您正在冒充另一个服务帐户。

如果您正在模拟服务帐户,则需要通过Identity-2上的IAM角色授予正确的IAM权限。成员集为Identity-1. 这样想:Identity-2必须授予权限Identity-1.

如果您正在模拟用户身份,则需要设置Google Workspace域范围授权. 您所模拟的帐户必须由Google Workspace管理。参考Google工作空间域范围授权是设置用户帐户模拟,这在您的情况下是不需要的。

现在您可能想知道,哪个身份需要假冒的权利?JWT表示的标识。该标识由JWT声明iss声明.您的JWT不包含iss声明. 有关示例的更多详细信息,请参阅此链接。您所模拟的身份由claim指定. 在OAuth中,speakiss正在冒充.

第3部分:

你还必须配置你的谷歌云项目来支持你的目标。这需要启用两个api:

  • iamcredentials.googleapis.com
  • cloudresourcemanager.googleapis.com

解决方案:

  1. 启用所需的api:

gcloud services enable iamcredentials.googleapis.com

gcloud services enable cloudresourcemanager.googleapis.com

  1. 设置计算引擎访问范围to允许完全访问所有云api. 这需要关闭虚拟机并编辑虚拟机配置。

  2. 添加iss使用值Identity-1向您正在创建的JWT声明.

  3. 授予IAM Role包含权限IAM . serviceaccounts . signjwt. 一个很好的角色是服务帐户令牌创建者单位矩阵。查看此链接了解更多信息。

示例命令:

gcloud iam service-accounts add-iam-policy-binding [Identity-2] 
--member serviceAccount:[Identity-1 
--role roles/iam.serviceAccountTokenCreator