从 OIDC 身份提供商访问资源

本文档介绍如何使用身份联合从支持 OpenID Connect (OIDC) 的身份提供商访问 Google Cloud 资源。

传统上,在 Google Cloud 外部运行的应用使用服务帐号密钥来访问 Google Cloud 资源。通过使用身份联合,您可以让外部身份模拟服务帐号。这样一来,您的工作负载便可以使用短期有效的访问令牌直接访问 Google Cloud 资源,而与服务帐号密钥相关联的维护和安全负担也得以消除。

准备工作

  1. 启用 IAM, Resource Manager, Service Account Credentials, and Security Token Service (STS) API。

    启用 API

  2. 确保您拥有项目的 Workload Identity Pool Admin (roles/iam.workloadIdentityPoolAdmin) 和 Service Account Admin (roles/iam.serviceAccountAdmin) 角色。

    此外,IAM Owner (roles/owner) 基本角色还具有配置身份联合的权限。您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。

  3. 为您的组织更新组织政策,以允许来自身份提供商的联合身份服务。

  4. 创建 Google Cloud 服务帐号

  5. 向服务帐号授予调用您的工作负载所需的 Google Cloud API 的访问权限

OIDC 的身份提供商设置

将 OIDC 身份提供商添加到工作负载身份池时,您必须提供以下内容:

  • 提供商的 ID。

  • 提供商的颁发者 URI。其格式通常为 https://example.com。如需查找该 URI,请参阅提供商有关 OIDC 集成的文档。

  • 特性映射列表,用于将外部令牌上的声明映射到 Google 令牌上的特性。您可以使用 assertion 来引用外部凭据,使用 google 来表示 Google 特性,使用 attribute 来表示自定义特性。

    Google 特性有两个:google.subjectgoogle.groups。您可以在 IAM 角色绑定中引用这些特性。google.subject 也会显示在 Cloud Logging 日志条目中。

    您必须为 google.subject 提供映射。通常,我们建议将其映射到 assertion.sub,这样可提供在 IAM 角色绑定中使用的固定标识符。映射如下所示:

    google.subject=assertion.sub
    

    对于更复杂的断言,您可以使用通用表达式语言。例如,如果工作负载身份池包含多个身份提供商,则您可以附加前缀来区分它们:

    google.subject="provider-a::" + assertion.sub
    

    google.subject 字段不能超过 127 个字符。

    您还可以指定自定义特性。例如,以下代码将 assertion.foo 映射到 attribute.bar

    attribute.bar=assertion.foo
    

    如需查看您可以引用的声明的完整列表,请参阅提供商的访问令牌文档。

    如需在表达式中引用声明的特定部分,请使用 CEL extract() 函数,该函数会根据您提供的模板从声明中提取值。如需详细了解 extract(),请参阅从特性中提取值

    如需检查凭据是否包含声明,请使用 has() 函数。

  • 允许的目标设备列表,用于指定外部凭据上的 aud 字段可以包含哪些值。您最多可以配置 10 个目标设备,每个目标设备最多 256 个字符。如需了解 aud 的默认值,请参阅提供商的文档。

    或者,如果身份提供商允许您配置 aud 的自定义值,则您可以将允许的目标设备参数留空,并将 aud 的值设置为工作负载身份提供商的完整资源名称。HTTP 前缀是可选的;例如:

    //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    

    无论是哪种情况,系统都会拒绝任何不包含某个允许值的令牌交换请求。

您还可以提供几个可选参数:

  • 显示名和说明。

  • 指定主帐号必须提供的特性的特性条件。该特性条件可以应用于外部凭据上的声明或 Google 凭据上的特性。任何不符合该特性条件的请求都会被拒绝。

    特性条件的格式为返回布尔值的 CEL 表达式。例如,以下代码会拒绝来自非特定群组成员的任何身份的请求:

    GROUP in assertion.groups
    

    如果身份提供商面向公众提供服务,则我们强烈建议您使用特性条件。如需详细了解常见用例,请参阅特性条件

创建工作负载身份池和提供商

您可使用“工作负载身份池”来组织和管理外部身份。工作负载身份池彼此隔离,但是单个池可以模拟任意数量的服务帐号。一般说来,我们建议为您的每个环境(例如开发环境、预演环境或生产环境)创建一个新池。

如需创建新的工作负载身份池,您需要提供一个 ID。您还可以提供可选的说明和显示名。ID 不能以 gcp- 开头;此前缀已预留给 Google 使用。

创建工作负载身份池后,您可以添加工作负载身份池提供商。每个工作负载身份池提供商代表一个特定身份提供商。单个池可以包含多个提供商。如需创建提供商,您需要 OIDC 身份提供商设置部分此页面上所述的信息。

控制台

  1. 在 Cloud Console 中,转到新建工作负载提供商和池页面。

    转到“新建工作负载提供商和池”

  2. 输入工作负载身份池的名称。

    Cloud Console 将使用该名称创建池 ID。如需更改池 ID,请点击修改。池 ID 创建后便无法更改。

  3. 可选:输入工作负载身份池的说明。

  4. 点击继续

  5. 选择提供商下拉列表中,选择 OpenID Connect (OIDC),然后点击继续

  6. 输入提供商名称。

    Cloud Console 将使用该名称创建提供商 ID。如需更改提供商 ID,请点击修改。提供商 ID 创建后便无法更改。

  7. 输入提供商的颁发者网址,然后点击继续

  8. 如需配置特性映射,请点击修改映射

    通过特性映射,您可以使用有关外部身份的信息来授予对其中一部分身份的访问权限。对于 OIDC 身份提供商,我们建议将 google.subject 映射到 assertion.sub。其他映射是可选的。

    如需了解详情,请参阅本页面上的 OIDC 身份提供商设置

  9. 可选:如需提供用于指定可进行身份验证的身份的特性条件,请点击添加条件并输入有效的通用表达式语言 (CEL) 表达式。如需了解详情,请参阅特性条件

  10. 点击保存以创建工作负载身份池和提供商。

gcloud

如需创建工作负载身份池,请使用 gcloud iam workload-identity-pools create 命令:

gcloud iam workload-identity-pools create POOL_ID \
    --location="global" \
    --description="DESCRIPTION" \
    --display-name="DISPLAY_NAME"

响应如下所示:

Created workload identity pool [POOL_ID].

如需添加工作负载身份池提供商,请使用 gcloud iam workload-identity-pools providers create-oidc 命令:

gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
    --workload-identity-pool="POOL_ID" \
    --issuer-uri="ISSUER_URI" \
    --location="global" \
    --attribute-mapping="google.subject=assertion.sub"

响应如下所示:

Created workload identity pool provider [PROVIDER_ID].

REST

如需创建工作负载身份池,请执行以下操作:

projects.locations.workloadIdentityPools.create 方法可创建工作负载身份池。

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id

请求 JSON 正文:

{
  "description": "description",
  "display-name": "display-name"
}

如需发送您的请求,请展开以下选项之一:

该方法会返回长时间运行的 Operation,类似于以下内容:

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/operations/operation-id"
}

如需添加工作负载身份池提供商,请执行以下操作:

projects.locations.workloadIdentityPools.providers.create 方法可添加 OIDC 身份提供商。

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

请求 JSON 正文:

{
  "issuerUrl": "issuer-uri"
}

如需发送您的请求,请展开以下选项之一:

该方法会返回长时间运行的 Operation,类似于以下内容:

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id/operations/operation-id"
}

允许外部身份模拟服务帐号

外部身份无法直接访问大多数 Google Cloud 资源。相反,通过在服务帐号上授予 Workload Identity User 角色 (roles/iam.workloadIdentityUser),让身份可模拟服务帐号。当外部身份模拟服务帐号时,它们拥有与该服务帐号相同的角色和权限。

如需向外部身份授予 Workload Identity User 角色,请执行以下操作:

控制台

在授予 Workload Identity User 角色之前,确定您允许模拟服务帐号的身份。您可以根据特性映射,将该角色授予工作负载身份池中的所有身份或其中部分身份:

身份 特性名称 属性值
单一身份 subject SUBJECT_NAME
具有特定特性值的所有身份 ATTRIBUTE_NAME ATTRIBUTE_VALUE

然后,向该服务帐号授予访问权限,并视需要下载配置文件以自动生成凭据

  1. 在 Cloud Console 中,转到工作负载身份池页面。

    转到“工作负载身份池”

  2. 找到包含外部身份的工作负载身份池,然后点击其 修改图标。Cloud Console 将显示工作负载身份池的相关详细信息。

  3. 点击 授予访问权限

  4. 服务帐号下拉列表中,选择外部身份将模拟的服务帐号。

  5. 选择池中的哪些身份可以模拟服务帐号。

    如需允许所有身份模拟服务帐号,请选择池中的所有身份

    如需允许一部分身份模拟服务帐号,请选择仅与过滤条件匹配的身份,然后执行以下操作:

    1. 特性名称下拉列表中,选择要评估的特性。

      列表中仅显示映射的特性google.attribute. 前缀不会显示。

    2. 特性值字段中,输入特性的预期值。

  6. 点击保存

    如果身份已获得服务帐号的访问权限,则 Cloud Console 会显示有关工作负载身份池的详细信息。您可以跳过其余步骤。

    如果身份已获得服务帐号的访问权限,则 Cloud Console 会显示配置您的应用对话框。

  7. 可选:如需下载用于自动生成凭据的配置文件,请执行以下操作:

    1. 提供商下拉列表中,选择包含将模拟服务帐号的外部身份的提供商。

    2. 点击 下载配置以下载 JSON 配置文件。

  8. 点击关闭

gcloud

在授予 Workload Identity User 角色之前,确定您允许模拟服务帐号的身份。您可以根据特性映射,将该角色授予工作负载身份池中的所有身份或其中部分身份:

身份 成员格式
单一身份 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_NAME
具有特定特性值的所有身份 principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
池中的所有身份 principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

然后,运行 gcloud iam service-accounts add-iam-policy-binding 命令:

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="MEMBER"

替换以下值:

  • SERVICE_ACCOUNT_EMAIL:服务帐号的电子邮件地址。
  • MEMBER:将模拟服务帐号的外部身份。

REST

在授予 Workload Identity User 角色之前,确定您允许模拟服务帐号的身份。您可以根据特性映射,将该角色授予工作负载身份池中的所有身份或其中部分身份:

身份 成员格式
单一身份 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_NAME
具有特定特性值的所有身份 principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
池中的所有身份 principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

然后使用读取-修改-写入模式更新政策:

  1. 读取服务帐号的当前 IAM 政策。
  2. 修改政策以授予该角色。
  3. 写入更新后的政策。

读取服务帐号的 IAM 政策。

serviceAccounts.getIamPolicy 方法可获取服务帐号的 IAM 政策。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务帐号的 ID。此 ID 可以是服务帐号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务帐号的唯一数字 ID。

  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

如果没有现有政策,则响应仅包含默认的 etag。如果收到此响应,请添加一个 version 字段(设置为 3)和一个 bindings 字段(设置为一个空数组)。

修改政策以向您的成员授予适当角色。

如需授予角色,请修改响应正文中的 bindings 数组:

  • 如果角色不存在绑定,请向 bindings 数组添加一个新对象,以定义您要授予的角色以及要将角色授予的成员。
  • 如果角色已存在绑定,请将新成员添加到现有成员列表中。

示例

如需向池中的所有身份授予 Workload Identity User 角色 (roles/iam.workloadIdentityUser),请更改上一步中显示的示例,如下所示:

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.workloadIdentityUser",
      "members": [
        "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/*"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

写入更新后的政策。

serviceAccounts.setIamPolicy 方法为服务帐号设置更新后的 IAM 政策。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务帐号的 ID。此 ID 可以是服务帐号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务帐号的唯一数字 ID。

  • POLICY:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考文档

    例如,要设置上一步中显示的政策,请将 policy 替换为以下内容:

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.workloadIdentityUser",
          "members": [
            "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/*"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

请求 JSON 正文:

{
  "policy": POLICY
}

如需发送您的请求,请展开以下选项之一:

响应中包含更新后的政策。

生成 Google 凭据

如果您使用受支持的客户端库,则可以配置客户端库使其自动生成 Google 凭据。或者,您也可以手动生成 OIDC ID 令牌,然后用该令牌换取 Google 凭据。

如果可能的话,我们建议您自动生成凭证,这样您就无需进行令牌交换过程。

自动生成凭据

如果您使用以下其中一种语言的客户端库访问 Google Cloud,则可以使用身份联合将客户端库配置为自动生成凭据:

C++

大多数 C++ 版 Google Cloud 客户端库 通过使用 ChannelCredentials 对象支持身份联合,该对象是通过调用 grpc::GoogleDefaultCredentials() 创建的。如要初始化此凭据,必须使用 gRPC 的 1.36.0 版本或更高版本构建客户端库。

C++ 版 Cloud Storage 客户端库使用的是 REST API,而不是 gRPC,因此不支持身份联合。

Go

如果 Go 客户端库使用 golang.org/x/oauth2 模块的 v0.0.0-20210218202405-ba52d332ba99 版本或更高版本,则客户端库支持身份联合。

如要查看客户端库使用的模块版本,请运行以下命令:

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

如果 Java 客户端库使用 com.google.auth:google-auth-library-oauth2-http 工件的 0.24.0 版或更高版本,则客户端支持身份联合。

如需查看该客户端库使用的工件版本,请在应用目录中运行以下 Maven 命令:

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

如果 Node.js 客户端库使用 google-auth-library 软件包的 7.0.2 版本或更高版本,则客户端支持身份联合。

如要查看客户端库使用的软件包版本,请在应用目录中运行以下命令:

npm list google-auth-library

创建 GoogleAuth 对象时,您可以指定项目 ID,也可以允许 GoogleAuth 自动查找项目 ID。如要自动查找项目 ID,配置文件中的服务帐号必须具有项目的 Browser 角色 (roles/browser) 或具有同等权限的角色。如需了解详情,请参阅 google-auth-library 软件包的 README

Python

如果 Python 客户端库使用 google-auth 软件包的 1.27.0 版本或更高版本,则客户端支持身份联合。

如要检查客户端库使用的软件包版本,请在已安装该软件包的环境中运行以下命令:

pip show google-auth

如要为身份验证客户端指定项目 ID,您可以设置 GOOGLE_CLOUD_PROJECT 环境变量,也可以允许客户端自动查找项目 ID。如要自动查找项目 ID,配置文件中的服务帐号必须具有项目的 Browser 角色 (roles/browser) 或具有同等权限的角色。如需了解详情,请参阅 google-auth 软件包用户指南

如需将客户端库配置为自动生成凭据,请创建一个 JSON 配置文件。您可以使用 Cloud Console 或 gcloud 工具创建此文件。

配置文件指定客户端库如何从身份提供商获取令牌。客户端库可通过以下几种不同方式获取令牌:

  • 文件来源凭据:从文件加载的令牌。其他进程在旧令牌到期前,必须使用新 OIDC 令牌刷新此文件,。例如,如果令牌的有效期为 1 小时,您必须在 1 小时之前刷新该文件。
  • 网址来源的凭据:使用响应 HTTP GET 请求的端点从本地服务器加载令牌。响应必须是 OIDC ID 令牌(采用纯文本或 JSON 格式)。

控制台

首先,按照本页面中的说明允许外部身份模拟服务帐号。然后,您可以为外部身份可以模拟的任何服务帐号创建 JSON 配置文件。

如需创建 JSON 配置文件,请执行以下操作:

  1. 在 Cloud Console 中,转到工作负载身份池页面。

    转到“工作负载身份池”

  2. 找到包含您要使用的身份提供商的工作负载身份池,然后点击其 修改图标。Cloud Console 会显示工作负载身份池的相关详细信息。
  3. 点击已关联的服务帐号
  4. 找到您要使用的服务帐号,然后点击 下载
  5. 提供商下拉列表中,选择包含将模拟服务帐号的 OIDC 身份的提供商。
  6. OIDC ID 令牌路径框中,输入以下内容之一:

    • 对于文件来源凭据:用于存储 OIDC ID 令牌的文件路径。
    • 对于网址来源凭据:为响应 HTTP GET 请求提供 OIDC ID 令牌的网址。
  7. 格式类型下拉列表中,选择 txt 代表文本格式或者选择 json 代表JSON 格式。

    如果您选择 json,请确认主题令牌字段名称框中的值与包含该令牌的 JSON 字段名称匹配。根据需要更新该值。

  8. 点击 下载配置以下载 JSON 配置文件,然后点击完成

如果您使用的是网址来源凭据,并且希望在请求中添加特定的 HTTP 标头,则可以将以下标头添加到配置文件中:

  1. 在文本编辑器中打开配置文件,并找到 headers 字段。修改后应如下所示:

    "headers": {},
    
  2. 将 HTTP 标头作为键值对添加到 headers 对象中。每个键和值都必须用英文双引号括起。

    例如,如需发送值为 testX-Example-One 标头以及值为 exampleX-Example-Two 标头,请添加以下内容:

    "headers": {
      "X-Example-One": "test",
      "X-Example-Two": "example"
    },
    
  3. 将所做的更改保存到配置文件。

gcloud

如需使用文件来源凭据,请运行 gcloud iam workload-identity-pools create-cred-config 命令以生成配置文件。--credential-source-type 是可选标志;--credential-source-field-name 是可选标志(除非 --credential-source-typejson):

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --output-file=CONFIGURATION_FILEPATH \
    --credential-source-file=TOKEN_FILEPATH \
    --credential-source-type=SOURCE_TYPE \
    --credential-source-field-name=FIELD_NAME

替换以下值:

  • PROJECT_NUMBER:项目的数字 ID。
  • POOL ID:Workload Identity 池的 ID。
  • PROVIDER_ID:workload identity 池提供程序的 ID。
  • SERVICE_ACCOUNT_EMAIL:要模拟的服务帐号的电子邮件地址。
  • CONFIGURATION_FILEPATH:配置文件的文件路径。
  • TOKEN_FILEPATH:将存储 OIDC ID 令牌的文件路径。
  • SOURCE_TYPE:OIDC ID 令牌文件的格式。设置为 textjson。默认值为 text
  • FIELD_NAME:对于 JSON 令牌文件,JSON 字段名称包含令牌。如果 --credential-source-typejson,则必须提供此值。

如需使用文件来源凭据,请运行 gcloud iam workload-identity-pools create-cred-config 命令以生成配置文件。--credential-source-headers--credential-source-type 是可选标志;--credential-source-field-name 是可选标志(除非 --credential-source-typejson):

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --output-file=CONFIGURATION_FILEPATH \
    --credential-source-url="TOKEN_URL" \
    --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
    --credential-source-type=source_type \
    --credential-source-field-name=field_name

替换以下值:

  • PROJECT_NUMBER:项目的数字 ID。
  • POOL_ID:Workload Identity 池的 ID。
  • PROVIDER_ID:workload identity 池提供程序的 ID。
  • SERVICE_ACCOUNT_EMAIL:要模拟的服务帐号的电子邮件地址。
  • CONFIGURATION_FILEPATH:配置文件的文件路径。
  • TOKEN_URL:为响应 HTTP GET 请求提供 OIDC ID 令牌的网址。
  • KEY_1KEY_2:请求中包含的 HTTP 标头的名称。
  • VALUE_1VALUE_2:请求中包含的 HTTP 标头的值。
  • SOURCE_TYPE:OIDC 令牌文件的格式。设置为 textjson。默认值为 text
  • FIELD_NAME:对于 JSON 令牌文件,字段名称包含令牌。如果 --credential-source-typejson,则必须提供此值。

生成配置文件后,将环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置为配置文件的文件路径。此环境变量告知客户端库使用应用默认凭据进行身份验证。如需了解详情,请参阅自动查找凭据

手动交换凭据

一旦外部身份能够模拟服务帐号,您就可以手动将其凭据交换为 Google 凭据。

如需交换凭据,请执行以下操作:

  1. 从身份提供商获取 OIDC ID 令牌(如需了解详细说明,请参阅身份提供商的文档)。

  2. 将 OIDC ID 令牌传递给 Security Token Service token() 方法,以获取联合访问令牌:

    REST

    token 方法可将第三方令牌交换为 Google 令牌。

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_NUMBER:您的 Google Cloud 项目编号。
    • POOL_ID:您创建的工作负载身份池的 ID。
    • PROVIDER_ID:您配置的身份提供商的 ID。
    • ACCESS_TOKEN:来自身份提供商的令牌。

    HTTP 方法和网址:

    POST https://sts.googleapis.com/v1/token

    请求 JSON 正文:

    {
      "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID",
      "grantType": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requestedTokenType": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subjectTokenType": "urn:ietf:params:oauth:token-type:jwt",
      "subjectToken": "ACCESS_TOKEN"
    }
    

    如需发送您的请求,请展开以下选项之一:

     

    该方法会返回联合令牌。

  3. 调用 generateAccessToken() 以将联合令牌交换为服务帐号访问令牌。有限数量的 Google Cloud API 支持联合令牌;所有 Google Cloud API 都支持服务帐号访问令牌。

    REST

    Service Account Credentials API 的 serviceAccounts.generateAccessToken 方法为服务帐号生成 OAuth 2.0 访问令牌。

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
    • SA_ID:您的服务帐号的 ID。此 ID 可以是服务帐号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务帐号的唯一数字 ID。
    • token:联合访问令牌。

    HTTP 方法和网址:

    POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken

    请求 JSON 正文:

    {
      "scope": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
    

    如需发送您的请求,请展开以下选项之一:

    如果 generateAccessToken 请求成功,响应正文会包含一个 OAuth 2.0 访问令牌和一个到期时间。然后,便可以使用 accessToken 代表服务帐号验证请求,直至到达 expireTime 时限:

    {
      "accessToken": "eyJ0eXAi...NiJ9",
      "expireTime": "2020-04-07T15:01:23.045123456Z"
    }
    

拥有服务帐号的访问令牌后,您可以通过在请求的 Authorization 标头中添加该令牌来使用它调用 Google Cloud API:

Authorization: Bearer SERVICE_ACCOUNT_ACCESS_TOKEN

该请求会以服务帐号的身份获得授权。

后续步骤