gpt4 book ai didi

google-cloud-platform - 获取谷歌服务帐户的 signedJwt token

转载 作者:行者123 更新时间:2023-12-05 01:56:57 25 4
gpt4 key购买 nike

我正在尝试为谷歌服务帐户生成签名的 JWT token

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

最佳答案

首先,我将尝试解释您收到错误的原因:

需要 iam.serviceAccounts.signJwt 权限才能对服务帐户执行此操作

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

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

您的代码需要使用 Identity-1 凭据的权限和模拟 Identity-2 的权限。

第 1 部分:

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

OAuth 范围不授予权限,OAuth 范围限制已通过 IAM 角色授予服务帐户的权限。这是我看到很多配置不正确的重要一点。我建议使用计算引擎 Access scopes 设置为 Allow full access to all Cloud APIs。然后修改/管理分配给分配给 Compute Engine 的服务帐户的 IAM 角色。

第 2 部分:

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

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

如果您要冒充用户身份,则需要设置 Google Workspace Domain-Wide Delegation of Authority。您模拟的帐号必须由 Google Workspace 管理。引用Google Workspace Domain-Wide Delegation of Authority设置了用户帐户模拟,这在您的情况下不是必需的。

现在您可能想知道,哪个身份需要模拟权? JWT 代表的身份。该身份由 JWT 声明 iss 声明。 您的 JWT 不包含 iss 声明。有关更多详细信息,请参阅此示例 link .您正在模拟的身份由声明 sub 指定。在 OAuth 中,iss 模拟 sub

第 3 部分:

您还必须配置您的 Google Cloud 项目以支持您的目标。这需要启用两个 API:

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

解决方案:

  1. 启用所需的 API:

gcloud 服务启用 iamcredentials.googleapis.com

gcloud 服务启用 cloudresourcemanager.googleapis.com

  1. 将 Compute Engine Access Scopes 设置为Allow full access to all Cloud APIs。这需要关闭 VM 并编辑 VM 配置。

  2. iss 声明添加到您使用值 Identity-1 创建的 JWT。

  3. 授予包含权限 iam.serviceAccounts.signJwt 的 IAM 角色。一个很好的角色是 Service Account Token Creator to Identity-2。看这个link了解更多详情。

示例命令:

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

关于google-cloud-platform - 获取谷歌服务帐户的 signedJwt token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69627857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com