令牌类型

Google Cloud 会发放多种类型的令牌,这些令牌的用途和交换方各不相同。

下表概述了主要令牌类别,其中包含不同的令牌类型。

令牌类别 通信路径 用途
访问令牌 授权服务器 客户端 Google API 允许客户端调用 Google Cloud API。
授予令牌的令牌 授权服务器 客户端 允许客户端获取新的或不同的令牌,可能是在稍后的时间点。
身份令牌 授权服务器 客户端 让客户端能够识别与之互动的用户。

访问令牌和身份令牌是不记名令牌。不记名令牌是通用令牌类别,可向拥有该令牌的一方授予访问权限。

使用不记名令牌进行身份验证依赖于加密协议(例如 HTTPS)提供的安全性;如果不记名令牌被拦截,则可能会被不法分子用来获取访问权限。

如果不记名令牌没有为您的应用场景提供足够的安全性,您可以使用情境感知访问权限、限制访问令牌的有效时间或使用双向传输层安全协议 (mTLS) 解决方案(例如 Chrome 企业进阶版)来降低令牌被盗的风险。

访问令牌

访问令牌允许客户端对 Google Cloud API 进行经过身份验证的调用。Google Cloud 支持多种不同类型的访问令牌,这些令牌具有以下共同属性:

  • 它们会对主账号(可以是用户或工作负载)进行身份验证。

  • 它们是为特定客户端签发的。

  • 它们是短期有效的,最多会在几小时后过期。

  • 它们仅限于某些 OAuth 范围、端点或资源。这意味着,访问令牌通常不会授予对用户所有资源的访问权限,而只会授予对其中一部分资源的访问权限。

访问令牌的不同之处体现在以下方面:

  • 发放者:发放令牌的一方。

  • 主账号:令牌可验证的主账号类型。

  • 限制:可对令牌施加的限制。

下表列出了不同类型的访问令牌:

令牌类型 颁发者 主账号 限制
用户访问令牌 Google 授权服务器
  • 用户(受管理的用户)
  • 用户(消费者账号)
OAuth 范围
服务账号访问令牌
  • Google 授权服务器
  • Google Cloud IAM 授权服务器
服务账号 OAuth 范围
全网域授权令牌 Google 授权服务器 用户(受管理的用户) OAuth 范围
服务账号 JSON Web 令牌 (JWT) 客户 服务账号 OAuth 范围或 API
联合访问令牌 Google Cloud IAM 授权服务器
  • 员工身份池主账号
  • 工作负载身份池主账号
OAuth 范围
凭证访问边界令牌 Google Cloud IAM 授权服务器
  • 用户(受管理的用户)
  • 用户(消费者账号)
  • 服务账号
特定 Cloud Storage 对象
客户端颁发的凭证访问边界令牌 客户 服务账号 特定 Cloud Storage 对象

不同类型的访问令牌还具有不同的安全属性:

  • 格式:某些访问令牌是不透明的,这意味着它们采用专有格式,无法检查。其他令牌则编码为 JSON Web 令牌,可由客户端解码。

  • 自省能力:有些不透明令牌可以使用Google Cloud API 进行自省,而有些则不能。

  • 生命周期:令牌的生命周期各不相同,并且可修改的程度也各不相同。

  • 可撤销性:有些令牌可以撤销。有些令牌在失效之前一直有效。

下表总结了不同访问令牌类型之间的差异。

令牌类型 格式 可内省 生命周期 可撤销的
用户访问令牌 不透明 1 小时
服务账号访问令牌 不透明 5 分钟 - 12 小时
全网域授权令牌 不透明 1 小时
服务账号 JSON Web 令牌 (JWT) JWT 不适用 5 分钟 - 1 小时
联合访问令牌 不透明 请参阅联合访问令牌
凭证访问边界令牌 不透明 请参阅 凭证访问边界令牌
客户端颁发的凭证访问边界令牌 不透明 不适用

用户访问令牌

用户访问令牌用于对用户进行身份验证,并授权客户端代表用户执行操作:

经过身份验证的主账号是受管理的用户账号消费者账号。 客户端可以是 Web 应用,也可以是原生应用。

用户访问令牌是不透明的。出于诊断目的,您可以使用以下命令检查访问令牌,并将 ACCESS_TOKEN 替换为有效的访问令牌:

curl "https://oauth2.googleapis.com/tokeninfo?access_token=ACCESS_TOKEN"

此命令会生成类似于以下示例的输出:

{
  "azp": "0000000000.apps.googleusercontent.com",
  "aud": "0000000000.apps.googleusercontent.com",
  "sub": "00000000000000000000",
  "scope": "openid https://www.googleapis.com/auth/userinfo.email",
  "exp": "1744687132",
  "expires_in": "3568",
  "email": "user@example.com",
  "email_verified": "true"
}

输出包含以下字段:

字段 名称 说明
aud 受众群体

相应令牌所针对的 OAuth 客户端,由其 OAuth 客户端 ID 标识。

OAuth 客户端可以为属于同一项目的其他 OAuth 客户端获取访问令牌。受众群体可能与被授权方不同。

azp 被授权方 请求令牌的 OAuth 客户端,由其 OAuth 客户端 ID 标识。
email 主电子邮件地址

用户的主邮箱。

仅当令牌包含 https://www.googleapis.com/auth/userinfo.email 范围时,才会显示此字段。

exp 到期 令牌的到期时间,以 Unix 纪元时间格式表示。
scope OAuth 范围 客户端被允许代表用户访问的 API 集,由 OAuth 范围标识。
sub 主题

经过身份验证的主账号,通过其唯一 ID 进行标识。

此 ID 等同于 Directory API 中公开的 ID。

用户访问令牌会在一小时后自动过期,但也可以根据需要提前撤销

默认情况下,用户访问令牌是不记名令牌,这意味着它们不受任何特定通信渠道、网络或其他凭证的限制。您可以选择通过部署基于证书的访问权限来实现令牌绑定,以便用户访问令牌只能与有效的 mTLS 客户端证书一起使用。

服务账号访问令牌

服务账号访问令牌用于对服务账号进行身份验证。令牌是不透明的,您可以使用 https://oauth2.googleapis.com/tokeninfo API 对其进行内省。

对于服务账号访问令牌,API 会返回类似于以下示例的输出:

{
  "azp": "000000000000000000000",
  "aud": "000000000000000000000",
  "scope": "https://www.googleapis.com/auth/userinfo.email",
  "exp": "1744687132",
  "expires_in": "3568",
  "email": "service-account@example.iam.gserviceaccount.com",
  "email_verified": "true",
  "access_type": "online"
}

服务账号令牌包含以下字段:

字段 名称 说明
aud 受众群体 令牌所对应的服务账号,相当于被授权方。
azp 被授权方 请求令牌的服务账号(由其唯一 ID 标识)。
email 主电子邮件地址

服务账号的邮箱。

仅当令牌包含 https://www.googleapis.com/auth/userinfo.email 范围时,才会显示此字段。

exp 到期 令牌的到期时间,以 Unix 纪元时间格式表示。

服务账号访问令牌无法撤销,在失效之前会一直有效。

默认情况下,服务账号访问令牌会在一小时后过期。通过使用 serviceAccounts.generateAccessToken 方法,您可以请求具有不同生命周期的令牌。由于令牌生命周期越长,风险就越大,因此您必须配置 iam.allowServiceAccountCredentialLifetimeExtension 限制条件,以允许客户端请求生命周期超过一小时的服务账号访问令牌。

全网域授权令牌

全网域授权令牌用于对用户进行身份验证,并授权服务账号代表用户执行操作。令牌是不透明的,您可以使用 https://oauth2.googleapis.com/tokeninfo API 对其进行内省。

对于全网域授权令牌,API 会返回类似于以下示例的输出:

{
  "azp": "000000000000000000000",
  "aud": "000000000000000000000",
  "scope": "https://www.googleapis.com/auth/admin.directory.user.readonly https://www.googleapis.com/auth/userinfo.email",
  "exp": "1744688957",
  "expires_in": "3540",
  "email": "user@example.com",
  "email_verified": "true",
  "access_type": "offline"
}

全网域授权令牌包含以下字段:

字段 名称 说明
aud 受众群体 令牌所对应的服务账号,相当于被授权方。
azp 被授权方 请求令牌的服务账号(由其唯一 ID 标识)。
email 主电子邮件地址

被模拟用户的主邮箱。

仅当令牌包含 https://www.googleapis.com/auth/userinfo.email 范围时,才会显示此字段。

exp 到期 令牌的到期时间,以 Unix 纪元时间格式表示。
scope OAuth 范围 客户端被允许代表模拟用户访问的 API 集,由 OAuth 范围标识。

全网域授权令牌会在一小时后自动过期,并且无法撤销。

服务账号 JSON Web 令牌

服务账号 JSON Web 令牌 (JWT) 用于对服务账号进行身份验证。服务账号访问令牌由授权服务器颁发,而服务账号 JWT 可以由客户端自行颁发。

有时,这些 JWT 也称为“自签名”JWT。如果您需要向某些 Google API 进行身份验证,但不想从授权服务器获取访问令牌(例如,在创建自己的客户端库时),这些 JWT 会非常有用。

如需签发服务账号 JWT,客户端必须执行以下步骤:

  1. 准备一个 JSON Web 签名载荷,其中包含服务账号的邮箱、OAuth 范围或 API 端点以及过期时间。

  2. 使用相应服务账号的服务账号密钥对载荷进行签名。客户端可以使用用户管理的服务账号密钥离线签署载荷,也可以使用 signJwt 方法和 Google 管理的服务账号密钥在线签署载荷。如需了解详情,请参阅创建自签名 JSON Web 令牌

解码后的服务账号 JWT 类似于以下内容,其中 SIGNATURE 已替换为令牌的签名:

{
  "alg": "RS256",
  "kid": "290b7bf588eee0c35d02bf1164f4336229373300",
  "typ": "JWT"
}.{
  "iss": "service-account@example.iam.gserviceaccount.com",
  "sub": "service-account@example.iam.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/cloud-platform",
  "exp": 1744851267,
  "iat": 1744850967
}.SIGNATURE

服务账号 JWT 可以通过 aud 键指定 API 端点,而不是在 scope 键中指定 OAuth 范围:

{
  "alg": "RS256",
  "kid": "290b7bf588eee0c35d02bf1164f4336229373300",
  "typ": "JWT"
}.{
  "iss": "service-account@example.iam.gserviceaccount.com",
  "sub": "service-account@example.iam.gserviceaccount.com",
  "aud": "https://cloudresourcemanager.googleapis.com/",
  "exp": 1744854799,
  "iat": 1744851199
}.SIGNATURE

服务账号 JWT 包含以下字段:

字段 名称 说明
aud 受众群体 客户端可访问的 API 端点。仅在未指定 scope 的情况下有效。
exp 到期 令牌的到期时间,以 Unix 纪元时间格式表示。
iat 发放时间 令牌发放时间,以 Unix 纪元时间格式表示。
iss 颁发者 令牌的签发者,即服务账号本身。
scope OAuth 范围 客户端获准访问的 API 集,由 OAuth 范围标识。仅在未指定 aud 的情况下有效。
sub 主题 经过身份验证的主账号,即服务账号本身。

服务账号 JWT 的有效期最长为一小时,且无法撤销。

联合访问令牌

联合访问令牌用于对工作负载池主账号或员工池主账号进行身份验证。

借助员工身份联合,客户端可以交换外部令牌,以获取用于对员工池主账号进行身份验证的联合访问令牌。工作负载身份池主账号由类似于以下内容的主账号标识符进行标识:

principal://iam.googleapis.com/locations/global/workforcePools/POOL/subject/raha@altostrat.com.

借助工作负载身份联合,客户端可以交换外部令牌,以获取用于对工作负载池主账号进行身份验证的联合访问令牌。工作负载身份池主账号由类似于以下内容的主账号标识符进行标识:

principal://iam.googleapis.com/projects/PROJECT/locations/global/workloadIdentityPools/POOL/subject/SUBJECT_ATTRIBUTE_VALUE

联合访问令牌是不透明的,无法进行内省。令牌无法撤销,并且在到期之前一直有效。每种令牌类型的过期时间取决于以下因素:

  • 员工身份联合会根据员工身份池提供方配置来设置令牌过期时间。

  • 工作负载身份联合会设置令牌过期时间,使其与外部令牌的过期时间一致。

凭证访问边界令牌

凭证访问边界令牌用于对用户或服务账号进行身份验证,并包含访问边界。访问权限边界会限制令牌,使其只能用于访问 Cloud Storage 资源的指定子集。

凭证访问边界令牌有时称为缩小范围的令牌,因为它们是从输入令牌派生出来的,但在授予访问权限的资源方面受到更多限制。

凭证访问边界令牌的过期时间是从输入令牌的过期时间派生出来的,输入令牌可以是用户访问令牌服务账号访问令牌。凭证访问边界令牌是不透明的,无法进行内省或撤销。

客户端颁发的凭证访问边界令牌

客户端签发的凭证访问边界令牌与凭证访问边界令牌类似,但针对以下场景进行了优化:客户端需要以高频率获取具有不同访问边界的凭证访问边界令牌。

客户端可以使用 Cloud 客户端库和访问边界中介令牌在本地创建客户端颁发的凭证访问边界令牌,但必须定期刷新该令牌。

客户端颁发的凭证访问边界令牌是不透明的,无法进行内省或撤销。

令牌授权令牌

令牌授权令牌允许客户端在稍后获取新的或不同的令牌。 Google Cloud 支持多种不同类型的令牌授权令牌,它们都具有以下共同点:

  • 它们表示之前的身份验证。

  • 它们会对主账号(可以是 Google 身份 [用户或工作负载] 或外部身份)进行身份验证。

  • 它们可兑换为访问令牌。

  • 它们不能用于进行 Google API 调用,这使它们与访问令牌有所不同。

令牌授权令牌在以下方面可能有所不同:

  • 发放者:发放令牌的一方。

  • 主账号:令牌可验证的主账号身份类型。

  • 限制:可对令牌施加的限制。

下表列出了不同类型的令牌授权令牌。

令牌类型 颁发者 兑换的访问令牌类型 主账号 限制
刷新令牌 Google 授权服务器 用户访问令牌
  • 用户(受管理的用户)
  • 用户(消费者账号)
OAuth 范围
授权代码 Google 授权服务器 用户访问令牌
  • 用户(受管理的用户)
  • 用户(消费者账号)
OAuth 范围
服务账号 JSON Web 令牌断言 客户
  • 全网域授权令牌
  • 服务账号访问令牌
  • 用户(受管理的用户)
  • 服务账号
OAuth 范围
外部 JSON Web 令牌 外部身份提供方 联合访问令牌 外部主账号
外部 SAML 断言或响应 外部身份提供方 联合访问令牌 外部主账号
Amazon Web Services (AWS) GetCallerIdentity 令牌 外部身份提供方 联合访问令牌 外部主账号

不同类型的令牌授权令牌还具有不同的安全属性:

  • 格式:有些令牌是不透明的。有些令牌可由客户端解码。

  • 生命周期:令牌的生命周期各不相同,并且可修改的程度也各不相同。

  • 多次使用:有些令牌授权令牌只能使用一次。有些令牌可多次使用。

  • 可撤销性:有些令牌可以撤销。有些令牌在失效之前一直有效。

下表总结了令牌授权令牌的这些属性之间的差异:

令牌类型 格式 生命周期 可撤销的 多次使用
刷新令牌 不透明 请参阅刷新令牌
授权代码 不透明 10 分钟
服务账号 JSON Web 令牌断言 JWT 5 分钟 - 1 小时
外部令牌或外部 JSON Web 令牌 JWT 取决于身份提供方 取决于身份提供方
外部 SAML 断言或响应 SAML 取决于身份提供方 取决于身份提供方
Amazon Web Services (AWS) GetCallerIdentity 令牌 文本 blob 取决于身份提供方 取决于身份提供方

刷新令牌

刷新令牌是不透明的令牌,可让客户端获取用户的 ID 令牌和访问令牌(如果用户之前已授权客户端代表其执行操作)。

刷新令牌与特定客户端相关联,只能与有效的客户端凭证(例如客户端 ID 和客户端密钥)搭配使用。

如果客户端的授权包含一个或多个 Google Cloud OAuth 范围,则刷新令牌的生命周期受Google Cloud 会话时长控制。否则,刷新令牌将保持有效,直到用户撤销其授权或发生其他令牌撤销事件

授权代码

授权代码是不透明的短期有效令牌。这些代码仅用于在用户身份验证期间作为客户端与 Google 授权服务器之间的中介

刷新令牌类似,授权代码与客户端相关联,只能与有效的客户端凭证结合使用。与刷新令牌不同,授权代码只能使用一次。

服务账号 JSON Web 令牌断言

服务账号 JSON Web 令牌 (JWT) 断言用于断言服务账号的身份。工作负载可以使用服务账号 JWT 断言来获取服务账号访问令牌全网域授权令牌。服务账号 JWT 断言由服务账号密钥签名。

解码后的服务账号 JWT 断言类似于以下内容,其中 SIGNATURE 替换为令牌的签名:

{
  "alg": "RS256",
  "kid": "290b7bf588eee0c35d02bf1164f4336229373300",
  "typ": "JWT"
}.{
  "iss": "service-account@example.iam.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1744851267,
  "iat": 1744850967
}.SIGNATURE

服务账号 JWT 断言在结构上与服务账号 JWT 类似:这两种类型的令牌都可以由客户端本身签发,并且都由服务账号密钥签名。不过,这两种类型的令牌使用不同的载荷,如下表中所述。

字段 服务账号 JWT 服务账号 JWT 断言
aud Google Cloud API(如果指定了 scope,则省略) 必须为 https://oauth2.googleapis.com/token
exp 到期 到期
iat 发放时间 发放时间
iss 服务账号的邮箱 服务账号的邮箱
scope OAuth 范围(如果指定了 aud,则省略) OAuth 范围
sub 服务账号的邮箱 用于全网域授权的用户账号的邮箱,否则省略

服务账号 JWT 断言的有效期最长为一小时,且无法撤销。

外部 JSON Web 令牌

外部 JSON Web 令牌 (JWT) 由外部身份提供方(例如 Microsoft Entra ID、Okta、Kubernetes 或 GitHub)颁发。它们的结构和内容可能有所不同。

通过配置员工身份联合或工作负载身份联合,您可以在 Google Cloud 与外部身份提供方之间建立信任关系。然后,工作负载可以使用外部 JWT 作为令牌授权令牌来获取联合访问令牌

使用员工身份联合时,生成的联合访问令牌会对员工身份池主账号进行身份验证。

使用工作负载身份联合时,生成的联合访问令牌会对工作负载身份池主账号进行身份验证。

在这两种情况下,主账号标识符均派生自外部 JWT 的一项或多项声明。

为了与员工身份联合或工作负载身份联合兼容,外部 JWT 必须满足特定要求

外部 SAML 断言或响应

外部安全断言标记语言 (SAML) 断言是由外部身份提供方(例如 Microsoft Entra ID、Okta 或 Active Directory Federation Services)发布的 SAML 2.0 断言。这些外部 SAML 断言可以选择性地包含在 SAML 2.0 响应中或进行加密。

外部 JSON Web 令牌类似,您可以配置员工身份联合或工作负载身份联合,以便工作负载可以使用外部 SAML 断言或响应作为令牌授权令牌来获取联合访问令牌

为了与员工身份联合或工作负载身份联合兼容,外部 SAML 断言必须满足特定要求

Amazon Web Services (AWS) GetCallerIdentity 令牌

外部 AWS GetCallerIdentity 令牌是包含对 AWS GetCallerIdentity API 的签名请求的文本 blob。与外部 JSON Web 令牌和 SAML 断言类似,您可以配置员工身份联合或工作负载身份联合,以便工作负载可以使用这些文本 blob 作为令牌授权令牌来获取联合访问令牌

身份令牌

身份 (ID) 令牌可让客户端识别与其互动的用户。 Google Cloud 支持多种不同类型的身份令牌,它们都具有以下共同点:

  • 它们以 JSON Web 令牌 (JWT) 的格式呈现,以便客户端可以对其进行解码、验证和解读。

  • 它们会对主账号(可以是用户或工作负载)进行身份验证。

  • 它们是为特定客户端签发的。

  • 它们是短期令牌,最多会在 1 小时后过期。

  • 它们不可撤销。

  • 它们不能用于进行 Google API 调用,这使它们与访问令牌有所不同。

  • 它们不能用于获取访问令牌,这使它们与令牌授权令牌有所不同。

  • 它们可用于验证微服务之间的调用,也可用于以编程方式向 Identity-Aware Proxy (IAP) 进行身份验证

身份令牌的不同之处体现在以下方面:

  • 受众群体:旨在解码和使用令牌的一方。

  • 发放者:发放令牌的一方。

  • 生命周期:令牌的生命周期各不相同,并且可修改的程度也不同。

  • 主账号:令牌可验证的主账号身份类型。

下表列出了不同类型的身份令牌。

令牌类型 颁发者 受众群体 主账号 生命周期
用户 ID 令牌 Google 授权服务器 OAuth/OIDC 客户端
  • 用户(受管理的用户)
  • 用户(消费者账号)
1 小时
服务账号 ID 令牌 Google Cloud IAM 授权服务器 可自由选择任何受众群体 服务账号 1 小时
Identity-Aware Proxy (IAP) 断言 IAP
  • 后端
  • App Engine 应用
  • 用户(受管理的用户)
  • 用户(消费者账号)
  • 员工身份池主账号
10 分钟
SAML 断言 Google 授权服务器 SAML应用 用户(受管理的用户) 10 分钟

用户 ID 令牌

用户 ID 令牌是用于验证用户身份的 JSON Web 令牌 (JWT)。客户端可以通过启动 OIDC 身份验证流程来获取用户 ID 令牌。

用户 ID 令牌使用 Google JSON Web 密钥集 (JWKS) 进行签名。Google JWKS 是一种全球性资源,并且针对不同类型的用户(包括以下用户)使用相同的签名密钥:

  • 受管理的用户账号

  • 消费者用户账号

  • 服务账号

解码后的用户 ID 令牌类似于以下内容,其中 SIGNATURE 替换为令牌的签名:

{
  "alg": "RS256",
  "kid": "c37da75c9fbe18c2ce9125b9aa1f300dcb31e8d9",
  "typ": "JWT"
}.{
  "iss": "https://accounts.google.com",
  "azp": "1234567890-123456789abcdef.apps.googleusercontent.com",
  "aud": "1234567890-123456789abcdef.apps.googleusercontent.com",
  "sub": "12345678901234567890",
  "at_hash": "y0LZEe-ervzRNSxn4R-t9w",
  "name": "Example user",
  "picture": "https://lh3.googleusercontent.com/a/...",
  "given_name": "Example",
  "family_name": "User",
  "hd": "example.com",
  "iat": 1745361695,
  "exp": 1745365295
}.SIGNATURE

ID 令牌包含以下字段:

字段 名称 说明
aud 受众群体

相应令牌所针对的 OAuth 客户端,由其 OAuth 客户端 ID 标识。

OAuth 客户端可以为属于同一项目的其他 OAuth 客户端获取访问令牌。在这种情况下,受众群体可能与被授权方不同。

azp 被授权方 执行了 OIDC 身份验证流程的 OAuth 客户端,由其 OAuth 客户端 ID 标识。
exp 到期 令牌的到期时间,以 Unix 纪元时间格式表示。
hd 托管域名

用户的 Cloud Identity 或 Google Workspace 账号的主域名。

仅当用户是受管理的用户账号且客户端在身份验证请求中指定了 hd 参数时,此声明才会显示。

iss 颁发者 令牌的签发者。一律设置为 https://accounts.google.com
sub 主题

经过身份验证的主账号,通过其唯一 ID 进行标识。

此 ID 等同于 Directory API 中公开的 ID。

ID 令牌中包含的确切声明集取决于身份验证请求中的 scope 参数。

如需确定用户是否为受管理的用户账号,或确定用户所属的 Cloud Identity 或 Google Workspace 账号,客户端必须检查 hd 声明。

用户 ID 令牌的有效期为 1 小时,且无法撤销。

服务账号 ID 令牌

服务账号 ID 令牌是用于对服务账号进行身份验证的 JSON Web 令牌 (JWT)。

服务账号 JWT服务账号 JWT 断言不同,服务账号 ID 令牌不是由服务账号密钥签名的。相反,服务账号 ID 令牌由 Google JSON Web 密钥集 (JWKS) 签名。

解码后的服务账号 ID 令牌类似于以下内容,其中 SIGNATURE 已替换为令牌的签名:

{
  "alg": "RS256",
  "kid": "c37da75c9fbe18c2ce9125b9aa1f300dcb31e8d9",
  "typ": "JWT"
}.{
  "aud": "example-audience",
  "azp": "112010400000000710080",
  "email": "service-account@example.iam.gserviceaccount.com",
  "email_verified": true,
  "exp": 1745365618,
  "iat": 1745362018,
  "iss": "https://accounts.google.com",
  "sub": "112010400000000710080"
}.SIGNATURE

服务账号 ID 令牌包含以下字段:

字段 名称 说明
aud 受众群体 相应令牌所针对方的标识符。该值可由令牌请求者自由选择。
azp 被授权方 请求令牌的服务账号(由其唯一 ID 标识)。
exp 到期 令牌的到期时间,以 Unix 纪元时间格式表示。
iss 颁发者 令牌的签发者,始终设置为 https://accounts.google.com
sub 主题 请求令牌的服务账号(由其唯一 ID 标识)。

ID 令牌中包含的确切声明集取决于请求 ID 令牌的方式。例如,由 Compute Engine 元数据服务器请求的 ID 令牌可以选择性地包含其他声明,以断言虚拟机的身份。使用 IAM Credentials API 请求的 ID 令牌可以选择性地包含服务账号项目的组织 ID。

与用户 ID 令牌不同,服务账号 ID 令牌不支持 hd 声明。

服务账号 ID 令牌的有效期为 1 小时,且无法撤销。

Identity-Aware Proxy 断言

Identity-Aware Proxy (IAP) 断言是 JSON Web 令牌 (JWT),IAP 会在 x-goog-iap-jwt-assertion HTTP 请求标头中将这些令牌传递给受 IAP 保护的 Web 应用。IAP 断言用于验证用户身份,也可作为请求已获得 IAP 授权的证明。

用户 ID 令牌服务账号 ID 令牌不同,IAP 断言不是使用 Google JSON Web 密钥集 (JWKS) 签名的。相反,IAP 断言使用单独的 JWKS(即 IAP JWKS)进行签名。此 JWKS 是一种全球性资源,并且相同的签名密钥可用于不同类型的用户,包括:

  • 受管理的用户账号

  • 消费者账号

  • 服务账号

  • 员工身份池主账号

解码后的 IAP 断言类似于以下内容,其中 SIGNATURE 替换为令牌的签名:

{
  "alg": "ES256",
  "typ": "JWT",
  "kid": "4BCyVw"
}.{
  "aud": "/projects/0000000000/global/backendServices/000000000000",
  "azp": "/projects/0000000000/global/backendServices/000000000000",
  "email": "user@example.com",
  "exp": 1745362883,
  "google": {
    "access_levels": [
      "accessPolicies/0000000000/accessLevels/Australia"
    ]
  },
  "hd": "example.com",
  "iat": 1745362283,
  "identity_source": "GOOGLE",
  "iss": "https://cloud.google.com/iap",
  "sub": "accounts.google.com:112010400000000710080"
}.SIGNATURE

如果您将 IAP 配置为使用员工身份联合而不是 Google 身份,IAP 断言会略有不同:

{
  "alg": "ES256",
  "typ": "JWT",
  "kid": "4BCyVw"
}.{
  "aud": "/projects/0000000000/global/backendServices/000000000000",
  "azp": "/projects/0000000000/global/backendServices/000000000000",
  "email": "user@example.com",
  "exp": 1745374290,
  "google": {
    "access_levels": [
      "accessPolicies/0000000000/accessLevels/Australia"
    ]
  },
  "iat": 1745373690,
  "identity_source": "WORKFORCE_IDENTITY",
  "iss": "https://cloud.google.com/iap",
  "sub": "sts.google.com:AAFTZ...Q",
  "workforce_identity": {
    "iam_principal": "principal://iam.googleapis.com/locations/global/workforcePools/example/subject/user-0000000000",
    "workforce_pool_name": "locations/global/workforcePools/example"
  }
}.SIGNATURE

IAP 断言包含以下字段:

字段 名称 说明
aud 受众群体 IAP 断言所针对的后端服务、App Engine 应用或 Cloud Run 服务。
iss 颁发者 令牌的签发者,始终设置为 https://cloud.google.com/iap
sub 主题

经过身份验证的主账号,通过其唯一 ID 进行标识。

如果 IAP 配置为使用 Google 身份,则此 ID 等同于 Directory API 中公开的 ID。

如需详细了解 IAP 断言声明,请参阅验证 JWT 载荷

IAP 断言的有效期为 10 分钟,且无法撤销。

SAML 断言

安全断言标记语言 (SAML) 断言用于对受管理的用户账号进行身份验证,并授权他们访问自定义 SAML 应用。SAML 断言由 Cloud Identity 签发和签名,只能用于对受管理的用户账号进行身份验证。

与使用全局密钥签名的 ID 令牌不同,SAML 断言使用特定于 Cloud Identity 或 Google Workspace 账号的密钥进行签名。

解码后的 SAML 响应断言类似于以下内容:

<saml2:Assertion
  xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="..."
  IssueInstant="2025-04-23T22:47:20.881Z"
  Version="2.0">
  <saml2:Issuer>
    https://accounts.google.com/o/saml2?idpid=C0123456789
  </saml2:Issuer>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">...</ds:Signature>
  <saml2:Subject>
    <saml2:NameID
      Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">
        user@example.com
    </saml2:NameID>
    <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
      <saml2:SubjectConfirmationData
        NotOnOrAfter="2025-04-23T22:52:20.881Z"
        Recipient="https://app.example.com/"/>
    </saml2:SubjectConfirmation>
  </saml2:Subject>

  <saml2:Conditions
    NotBefore="2025-04-23T22:42:20.881Z"
    NotOnOrAfter="2025-04-23T22:52:20.881Z">
    <saml2:AudienceRestriction>
      <saml2:Audience>example-app</saml2:Audience>
    </saml2:AudienceRestriction>
  </saml2:Conditions>

  <saml2:AuthnStatement
    AuthnInstant="2025-04-23T22:46:44.000Z"
    SessionIndex="...">
    <saml2:AuthnContext>
      <saml2:AuthnContextClassRef>
        urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified
      </saml2:AuthnContextClassRef>
    </saml2:AuthnContext>
  </saml2:AuthnStatement>
</saml2:Assertion>

SAML 断言包含以下字段:

字段 名称 说明
Audience 受众群体 SAML 应用的实体 ID。
Issuer 颁发者 令牌的签发者,特定于 Cloud Identity 或 Google Workspace 账号。
NameID 主题 经过身份验证的主账号。标识符的格式取决于 SAML 应用的配置。

SAML 断言中包含的确切属性集取决于 SAML 应用的配置。

SAML 断言的有效期为 10 分钟,无法撤销。