我正在尝试为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
解决方案:
- 启用所需的api:
gcloud services enable iamcredentials.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
设置计算引擎访问范围to允许完全访问所有云api. 这需要关闭虚拟机并编辑虚拟机配置。
添加iss使用值Identity-1向您正在创建的JWT声明.
授予IAM Role包含权限IAM . serviceaccounts . signjwt. 一个很好的角色是服务帐户令牌创建者单位矩阵。查看此链接了解更多信息。
示例命令:
gcloud iam service-accounts add-iam-policy-binding [Identity-2]
--member serviceAccount:[Identity-1
--role roles/iam.serviceAccountTokenCreator