本页面介绍了用于获取 Google 签名的 OpenID Connect (OIDC) ID 令牌的一些方法。
您需要在以下身份验证使用场景中使用 Google 签名的 ID 令牌:
- 访问 Cloud Run 服务
- 调用 Cloud Run functions
- 向受 Identity-Aware Proxy (IAP) 保护的应用验证用户的身份
- 向使用 API Gateway 或 Cloud Endpoints 部署的 API 发出请求
如需了解 ID 令牌的内容和有效期,请参阅 ID 令牌。
ID 令牌具有其可用于的特定服务或应用,由其 aud
声明的值指定。本页面使用“目标服务”一词来指代可使用 ID 令牌向其进行身份验证的服务或应用。
获取 ID 令牌后,您可以将其添加到对目标服务的请求的 Authorization
标头中。
获取 ID 令牌的方法
获取 ID 令牌的方法有多种。本页介绍了以下几种方法:
如果您需要 ID 令牌被不在 Google Cloud 上托管的应用接受,则或许可以使用这些方法,但您应该确定应用所需的 ID 令牌声明。
从元数据服务器获取 ID 令牌
如果您的代码在可以关联服务账号的资源上运行,所关联服务的元数据服务器在大多数情况下都可以提供 ID 令牌。元数据服务器会为关联的服务账号生成 ID 令牌。您无法从元数据服务器获取基于用户凭据的 ID 令牌。
您的代码在以下 Google Cloud 服务上运行时,您可以从元数据服务器获取 ID 令牌:
- Compute Engine
- App Engine 标准环境
- App Engine 柔性环境
- Cloud Run 函数
- Cloud Run
- Google Kubernetes Engine
- Cloud Build
如需从元数据服务器检索 ID 令牌,您需要查询服务账号的身份端点,如以下示例所示。
curl
将 AUDIENCE
替换为目标服务的 URI,例如 http://www.example.com
。
curl -H "Metadata-Flavor: Google" \ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE'
PowerShell
将 AUDIENCE
替换为目标服务的 URI,例如 http://www.example.com
。
$value = (Invoke-RestMethod ` -Headers @{'Metadata-Flavor' = 'Google'} ` -Uri "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE") $value
Java
如需运行此代码示例,您必须安装 Java 版身份验证客户端库。
Go
Node.js
如需运行此代码示例,您必须安装 Node.js 版 Google 身份验证库
Python
如需运行此代码示例,您必须安装 Python 版 Google 身份验证库。
Ruby
如需运行此代码示例,您必须安装 Ruby 版 Google 身份验证库。
使用连接服务生成 ID 令牌
某些 Google Cloud 服务可帮助您调用其他服务。您可以借助这些连接服务来确定何时需进行调用或管理涉及调用服务的工作流。以下服务在调用需要 ID 令牌的服务时,会自动添加 ID 令牌,并包含相应的 aud
声明值:
- Cloud Scheduler
- Cloud Scheduler 是一项全托管式企业级 Cron 作业调度器。您可以将 Cloud Scheduler 配置为在调用其他服务时包含 ID 令牌或访问令牌。如需了解详情,请参阅对 HTTP 目标使用身份验证。
- Cloud Tasks
- Cloud Tasks 可让您管理分布式任务的执行。您可以将任务配置为在调用服务时包含 ID 令牌或访问令牌。如需了解详情,请参阅将 HTTP 目标任务与身份验证令牌搭配使用。
- Pub/Sub
- Pub/Sub 可实现服务之间的异步通信。您可以将 Pub/Sub 配置为在消息中包含 ID 令牌。如需了解详情,请参阅推送订阅身份验证。
- Workflows
- Workflows 是一个全托管式编排平台,该平台会按照您定义的顺序执行服务:工作流。您可以将工作流定义为在调用其他服务时包含 ID 令牌或访问令牌。如需了解详情,请参阅通过工作流发出经过身份验证的请求。
通过模拟服务账号生成 ID 令牌
借助服务账号模拟,主账号可为可信服务账号生成短期有效凭据。然后,主账号可以使用这些凭据以服务账号的身份进行身份验证。
主账号必须对服务账号具有可启用模拟的 IAM 角色,才能模拟此服务账号。如果主账号本身是另一个服务账号,则只需直接向该服务账号提供所需的权限并使其模拟自身可能看起来更加容易。此配置(称为自模拟)会造成安全漏洞,因为它会让服务账号创建可以永久刷新的访问令牌。
服务账号模拟应始终涉及两个主账号:代表调用方的主账号,以及被模拟的服务账号(称为具有权限的服务账号)。
如需通过模拟服务账号生成 ID 令牌,请按照以下常规流程操作。
如需查看分步说明,请参阅创建 ID 令牌。
确定或创建服务账号,使其成为具有权限的服务账号。
-
确定调用目标服务所需的角色。向服务账号授予目标服务的以下角色:
-
对于 Cloud Run 服务,请授予 Cloud Run Invoker 角色 (
roles/run.invoker
)。 -
对于 Cloud Run functions,请授予 Cloud Functions Invoker 角色 (
roles/cloudfunctions.invoker
)。 - 如需了解其他目标服务,请参阅相应服务的产品文档。
-
对于 Cloud Run 服务,请授予 Cloud Run Invoker 角色 (
确定将执行模拟的主账号,并设置应用默认凭据 (ADC) 以使用此主账号的凭据。
对于开发环境,主账号通常是您使用 gcloud CLI 提供给 ADC 的用户账号。但是,如果您在关联有服务账号的资源上运行,则关联的服务账号是主账号。
为主账号授予 Service Account OpenID Connect Identity Token Creator 角色 (
roles/iam.serviceAccountOpenIdTokenCreator
)。使用 IAM Credentials API 为已获授权的服务账号生成 ID 令牌。
生成通用 ID 令牌,以使用 Cloud Run 和 Cloud Run functions 进行开发
您可以使用 gcloud CLI 获取用户凭据的 ID 令牌,对于调用方具有调用所需 IAM 权限的任何 Cloud Run 服务或 Cloud Run functions,该令牌均可与其搭配使用。此令牌将无法用于其他任何应用。
如需生成通用 ID 令牌,请使用
gcloud auth print-identity-token
命令:gcloud auth print-identity-token
后续步骤
- 了解 ID 令牌。
- 使用 shell 命令查询 Compute Engine 元数据服务器。
- 详细了解身份验证方法。