从 Microsoft Azure 访问资源

本文档介绍如何使用身份联合从 Microsoft Azure 访问 Google Cloud 资源。

传统上,在 Google Cloud 外部运行的应用使用服务帐号密钥来访问 Google Cloud 资源。通过使用身份联合,您可以让 Azure 资源的代管式身份模拟服务帐号。这样一来,您的工作负载便可以使用短期有效的访问令牌直接访问 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. 为您的组织更新组织政策以允许来自 Azure 的联合。

  4. 创建 Google Cloud 服务帐号

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

Azure 身份提供商设置

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

  • 提供商的 ID。

  • 您的 Azure 租户 ID

  • 特性映射列表,用于将 Azure 管理的身份的令牌上的声明映射到 Google 令牌上的特性。您可以使用 assertion 来引用 Azure 令牌,使用 google 来表示 Google 特性,使用 attribute 来表示自定义特性。

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

    您必须为 google.subject 提供映射。通常,我们建议将其映射到 assertion.sub,其中包含您将在下一部分中创建的代管式身份的对象 ID。这样可以提供在 IAM 角色绑定中使用的固定标识符。映射如下所示:

    google.subject=assertion.sub
    

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

    google.subject="azure::" + assertion.tid + "::" + assertion.sub
    

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

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

    attribute.tid=assertion.tid
    

    以下示例根据 assertion.oid 的值分配显示名:

    attribute.managed_identity_name={
    "8bb39bdb-1cc5-4447-b7db-a19e920eb111":"workload1",
    "55d36609-9bcf-48e0-a366-a3cf19027d2a":"workload2"
    }[assertion.oid]
    

    如需获取您可以引用的声明的完整列表,请获取工作负载中 Azure 虚拟机的访问令牌。在您的请求中,请将 resource 参数替换为工作负载身份池的完整资源名称。

    例如:

    curl

    curl -s \
      'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID&object_id=MANAGED_IDENTITY_OBJECT_ID' \
      -H Metadata:true -H "Cache-Control: no-cache"
    

    PowerShell

    Invoke-WebRequest \
        -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID&object_id=MANAGED_IDENTITY_OBJECT_ID' \
        -Headers @{Metadata="true"}
    

    该响应是一个带有 access_token 字段的 JSON 对象,其中包含 Azure 虚拟机的访问令牌。要解码访问令牌并查看可用的声明,请按以下步骤操作:

    1. 复制完整的访问令牌。
    2. 在网络浏览器中,转到 https://jwt.ms/
    3. 将访问令牌粘贴到文本框中。
    4. 点击声明

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

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

您还可以选择提供以下内容:

  • 显示名和说明。

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

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

    "e968c2ef-047c-498d-8d79-16ca1b61e77e" in assertion.groups
    

    如需详细了解常见用例,请参阅特性条件

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

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

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

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

控制台

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

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

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

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

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

  4. 点击继续

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

  6. 输入提供商名称。

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

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

    对于 Azure,颁发者网址采用 https://sts.windows.net/AZURE_TENANT_ID 格式。

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

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

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

  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="https://sts.windows.net/AZURE_TENANT_ID" \
    --location="global" \
    --attribute-mapping="google.subject=assertion.sub"

响应如下所示:

Created workload identity pool provider [PROVIDER_ID].

REST

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

projects.locations.workloadIdentityPools.providers.create 方法会将 Azure 添加为提供商。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "attributeMapping": {
    "google.subject": "assertion.sub"
  },
  "oidc": {
    "issuerUri": "https://sts.windows.net/azure-tenant-id"
  }
}

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

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

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

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

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"
}

为身份联合配置 Azure 租户

如需为身份联合准备 Azure 租户,请执行以下操作:

  1. 创建一个 Azure AD 应用和服务主帐号,并将其应用 ID URI 设置为您在上一部分创建的提供商的完整资源名称:

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    
  2. 创建一个代管式身份,并记下其对象 ID。

  3. 将代管式身份分配给您要向其授予对 Google Cloud 资源的访问权限的虚拟机

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

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

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

控制台

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

身份 特性名称 属性值
特定托管身份 subject MANAGED_IDENTITY_OBJECT_ID
给定 Azure 租户中的所有 Azure 身份 group AZURE_TENANT_ID
具有特定特性值的所有身份 ATTRIBUTE_NAME ATTRIBUTE_VALUE

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

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

    转到“工作负载身份池”

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

  3. 点击 授予访问权限

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

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

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

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

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

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

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

  6. 点击保存

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

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

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

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

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

  8. 点击关闭

gcloud

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

身份 标识符格式
特定托管身份 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MANAGED_IDENTITY_OBJECT_ID
给定 Azure 租户中的所有 Azure 身份 principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/AZURE_TENANT_ID
具有特定特性值的所有身份 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="PRINCIPAL"

替换以下值:

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

REST

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

身份 标识符格式
特定托管身份 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MANAGED_IDENTITY_OBJECT_ID
给定 Azure 租户中的所有 Azure 身份 principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/AZURE_TENANT_ID
具有特定特性值的所有身份 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 凭据。或者,您也可以手动生成 Azure 凭据,然后用它们换取 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 工具创建此文件。

控制台

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

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

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

    转到“工作负载身份池”

  2. 找到包含您要使用的身份提供商的工作负载身份池,然后点击其 修改图标。Cloud Console 会显示工作负载身份池的相关详细信息。
  3. 点击已关联的服务帐号
  4. 找到您要使用的服务帐号,然后点击 下载
  5. 提供商下拉列表中,选择包含将模拟服务帐号的 Azure 身份的提供商。
  6. 点击 下载配置以下载 JSON 配置文件,然后点击完成

gcloud

如需创建 JSON 配置文件,请运行 gcloud iam workload-identity-pools create-cred-config 命令:

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=FILEPATH \
    --azure

替换以下值:

  • PROJECT_NUMBER:项目的数字 ID。
  • POOL_ID:Workload Identity 池的 ID。
  • PROVIDER_ID:workload identity 池提供程序的 ID。
  • SERVICE_ACCOUNT_EMAIL:要模拟的服务帐号的电子邮件地址。
  • FILEPATH:配置文件的文件路径。

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

手动交换凭据

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

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

  1. 使用 Azure Instance Metadata Service (IMDS) 来获取 Azure 访问令牌

    resource 查询参数设置为以下值:

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

    object_id 查询参数设置为您之前创建的代管式身份的对象 ID。

  2. 将 Azure 访问令牌传递给 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

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

后续步骤