首先,我将尝试解释为什么您会收到错误:
需要 iam.serviceAccounts.signJwt 权限才能对服务帐户执行此操作.
A) 您的代码正在使用默认服务帐户的计算服务上运行。我会称之为身份1.
B)您的代码正在冒充身份[电子邮件受保护] /cdn-cgi/l/email-protection。我会称之为身份2.
您的代码需要权限才能使用以下凭据身份1以及冒充的权利身份2.
Part 1:
当您使用计算服务的默认服务帐户或将服务帐户分配给计算服务时,两种形式的权限控制将生效。主控装置是IAM 角色分配给服务帐户。限制器是为计算服务设置的 ** OAuth 范围**。
OAuth 范围不授予权限,OAuth 范围限制已通过 IAM 角色授予服务账户的权限。这是很重要的一点,我看到很多配置不正确。我建议使用计算引擎访问范围 set to 允许完全访问所有云 API。然后修改/管理分配给分配给 Compute Engine 的服务帐号的 IAM 角色。
Part 2:
为了冒充另一个身份,在您的情况下身份1正在冒充身份2,您的代码必须有权这样做。有两种类型的身份可以被模拟: a) 服务帐户; b) 用户身份。就您而言,您正在冒充另一个服务帐户。
如果您模拟服务账户,则需要通过 IAM 角色授予正确的 IAM 权限身份2成员设置为身份1。可以这样想:身份2必须授予许可身份1.
如果您要模拟用户身份,则需要设置 Google Workspace域范围内的授权。您所模拟的帐号必须由 Google Workspace 管理。参考Google Workspace 域范围内的授权 https://developers.google.com/admin-sdk/directory/v1/guides/delegation已设置用户帐户模拟,这在您的情况下不是必需的。
现在您可能想知道,哪种身份需要冒充权? JWT 代表的身份。该身份由 JWT 声明声明iss. 您的 JWT 不包含 iss 声明。有关更多详细信息,请参阅示例link https://developers.google.com/identity/protocols/oauth2/service-account。您所冒充的身份由声明指定sub。在 OAuth 中讲iss正在冒充sub.
Part 3:
您还必须配置您的 Google Cloud 项目来支持您的目标。这需要启用两个 API:
- iamcredentials.googleapis.com
- cloudresourcemanager.googleapis.com
解决方案:
- 启用所需的 API:
gcloud services enable iamcredentials.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
-
设置计算引擎访问范围 to 允许完全访问所有云 API。这需要关闭 VM 并编辑 VM 配置。
-
Add the iss声明您使用该值创建的 JWT身份1.
-
授予包含权限的 IAM 角色iam.serviceAccounts.signJwt。一个很好用的角色是服务帐户令牌创建者到身份2。看到这个link https://cloud.google.com/iam/docs/understanding-roles#service-accounts-roles更多细节。
命令示例:
gcloud iam service-accounts add-iam-policy-binding [Identity-2] \
--member serviceAccount:[Identity-1\ \
--role roles/iam.serviceAccountTokenCreator