本页面介绍如何通过创建服务帐号的短期有效凭据来模拟该服务帐号。
一些系统架构围绕具有权限的服务帐号设计,旨在一起使用。在这种情况下,您可能需要为多个服务帐号创建凭据。
关于创建短期有效凭据
服务帐号可以使用短期有效凭据来验证对 Google Cloud API、其他 Google API 和非 Google API 的调用。短期有效凭据的生命周期有限,持续时间仅为几个小时或更短。如果您需要为信任的服务帐号授予对资源的有限访问权限,则短期有效服务帐号凭据会很有用。与服务帐号密钥等长期有效凭据相比,短期有效凭据还可以降低风险。
您可以通过模拟服务帐号来创建以下类型的短期有效凭据:
-
访问令牌是最常用的短期有效令牌。
-
ID 令牌遵循 OpenID Connect (OIDC) 规范,并且受数量有限的服务和应用的支持。
-
您可以使用自签名 JWT 向某些 Google API 进行身份验证,而无需从授权服务器获取访问令牌。使用 API Gateway 部署的 API 需要使用这些令牌。
-
自签名二进制 blob
当您需要安全地传输任意二进制数据时,自签名 blob 非常有用,通常可用于进行身份验证。
直接请求流程
当您使用直接请求流程为服务帐号创建短期有效凭据时,调用方发出创建短期有效凭据的直接请求。此流程涉及两种身份:调用方以及为其创建凭据的服务帐号。
如果您的系统架构是围绕多个层级的权限有限的服务帐号设计的,请参阅为多个服务帐号创建短期有效凭据。
准备工作
提供所需权限
直接请求涉及两种身份:调用方以及为其创建凭据的服务帐号。设置权限的方式取决于调用者使用的是服务帐号还是用户凭据。
如果要在本地开发环境中运行此页面上的示例,则需要使用用户凭据。对于生产用途(例如在 Compute Engine 上运行的应用),您可以使用服务帐号来表示调用者。
为用户帐号提供所需权限
如果您想使用 Google Cloud CLI 生成短期令牌,或者希望从本地开发环境生成短期令牌,则可以使用用户帐号生成令牌。通常,您可以使用自己的 Google 帐号。
如果您使用用户帐号生成短期令牌,则涉及以下身份:
调用者 Google 帐号 (
CALLER_ACCOUNT
)此用户帐号用于为具有权限的服务帐号生成短期凭据。
具有权限的服务帐号 (
PRIV_SA
)此服务帐号会被授予短期令牌所需的 IAM 角色。这是为其创建短期令牌的服务帐号。
如需启用 CALLER_ACCOUNT
以便为 PRIV_SA
创建短期有效凭据,请在 PRIV_SA
上授予 CALLER_ACCOUNT
Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator
)。
控制台
在 Google Cloud 控制台中,转到服务帐号页面。
选择一个项目。
点击具有权限的服务帐号
PRIV_SA
的电子邮件地址。点击权限标签页。
在有权访问此服务帐号的主帐号下,点击
授予访问权限。输入调用者 Google 帐号的电子邮件地址
CALLER_ACCOUNT
。例如
username@google.com
。选择 Service Account Token Creator 角色 (
roles/iam.serviceAccountTokenCreator
)。点击保存,向用户帐号授予角色。
gcloud
在 PRIV_SA
上授予所需的角色:
gcloud iam service-accounts add-iam-policy-binding
命令可向服务帐号授予角色。
在使用下面的命令数据之前,请先进行以下替换:
-
PRIV_SA
:生成令牌的具有权限的服务帐号的电子邮件地址。 -
CALLER_ACCOUNT
:用于请求短期令牌的用户帐号的电子邮件地址。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud iam service-accounts add-iam-policy-binding PRIV_SA --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator
Windows (PowerShell)
gcloud iam service-accounts add-iam-policy-binding PRIV_SA --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator
Windows (cmd.exe)
gcloud iam service-accounts add-iam-policy-binding PRIV_SA --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator
您应该会收到类似如下所示的响应:
Updated IAM policy for serviceAccount [PRIV_SA]. bindings: - members: - user:CALLER_ACCOUNT role: roles/iam.serviceAccountTokenCreator etag: BwXhCB4eyjY= version: 1
REST
首先,读取 PRIV_SA
的允许政策:
serviceAccounts.getIamPolicy
方法可获取服务帐号的允许政策。
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID
:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如my-project
。-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。 POLICY_VERSION
:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本。
HTTP 方法和网址:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy
请求 JSON 正文:
{ "options": { "requestedPolicyVersion": POLICY_VERSION } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/serviceAccountAdmin", "members": [ "user:admin@example.com" ] } ] }
如果您尚未为服务帐号授予任何角色,则响应将只包含 etag
值。请在下一步中添加该 etag
值。
接下来,请修改允许政策以授予 CALLER_ACCOUNT
Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator
)。
例如,如需修改上一步中的示例响应,请添加以下内容:
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/serviceAccountAdmin", "members": [ "user:admin@example.com" ] }, { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "user:CALLER_ACCOUNT" ] } ] }
最后,写入更新后的允许政策:
serviceAccounts.setIamPolicy
方法会为服务帐号设置更新后的允许政策。
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID
:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如my-project
。-
PRIV_SA
:为其创建短期令牌且具有相应权限的服务帐号的电子邮件地址。 POLICY_VERSION
:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本。-
POLICY
:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考。例如,要设置上一步中显示的允许政策,请将
POLICY
替换为以下内容,其中CALLER_ACCOUNT
是创建短期令牌的用户帐号:{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/serviceAccountAdmin", "members": [ "user:admin@example.com" ] }, { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "user:CALLER_ACCOUNT" ] } ] }
HTTP 方法和网址:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA
请求 JSON 正文:
{ "policy": POLICY }
如需发送您的请求,请展开以下选项之一:
响应包含更新后的允许政策。
为服务帐号提供所需权限
当调用应用使用服务帐号作为其身份时,涉及以下主帐号:
调用方服务帐号 (
CALLER_SA
)此服务帐号代表调用应用,该应用发出对短期有效凭据的请求。
具有权限的服务帐号 (
PRIV_SA
)此服务帐号会被授予短期令牌所需的 IAM 角色。这是为其创建短期令牌的服务帐号。
如需授予 CALLER_SA
为 PRIV_SA
创建短期有效凭据的权限,请在 PRIV_SA
上授予 CALLER_SA
Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator
)。
控制台
在 Google Cloud 控制台中,转到服务帐号页面。
选择一个项目。
点击具有权限的服务帐号
PRIV_SA
的电子邮件地址。点击权限标签页。
在有权访问此服务帐号的主帐号下,点击
授予访问权限。输入调用方服务帐号的电子邮件地址
CALLER_SA
。例如
demo@my-project.iam.gserviceaccount.com
。选择 Service Account Token Creator 角色 (
roles/iam.serviceAccountTokenCreator
)。点击保存,向服务帐号授予角色。
gcloud
在 PRIV_SA
上授予所需的角色:
gcloud iam service-accounts add-iam-policy-binding
命令可向服务帐号授予角色。
在使用下面的命令数据之前,请先进行以下替换:
-
PRIV_SA
:生成令牌的具有权限的服务帐号的电子邮件地址。 -
CALLER_SA
:表示请求短期令牌的应用的服务帐号的电子邮件地址。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud iam service-accounts add-iam-policy-binding PRIV_SA --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator
Windows (PowerShell)
gcloud iam service-accounts add-iam-policy-binding PRIV_SA --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator
Windows (cmd.exe)
gcloud iam service-accounts add-iam-policy-binding PRIV_SA --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator
您应该会收到类似如下所示的响应:
Updated IAM policy for serviceAccount [PRIV_SA]. bindings: - members: - serviceAccount:CALLER_SA role: roles/iam.serviceAccountTokenCreator etag: BwXhCB4eyjY= version: 1
REST
首先,读取 PRIV_SA
的允许政策:
serviceAccounts.getIamPolicy
方法可获取服务帐号的允许政策。
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID
:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如my-project
。-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。 POLICY_VERSION
:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本。
HTTP 方法和网址:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy
请求 JSON 正文:
{ "options": { "requestedPolicyVersion": POLICY_VERSION } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/serviceAccountAdmin", "members": [ "user:admin@example.com" ] } ] }
如果您尚未为服务帐号授予任何角色,则响应将只包含 etag
值。请在下一步中添加该 etag
值。
接下来,请修改允许政策以授予 CALLER_SA
Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator
)。
例如,如需修改上一步中的示例响应,请添加以下内容:
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/serviceAccountAdmin", "members": [ "user:admin@example.com" ] }, { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:CALLER_SA" ] } ] }
最后,写入更新后的允许政策:
serviceAccounts.setIamPolicy
方法会为服务帐号设置更新后的允许政策。
在使用任何请求数据之前,请先进行以下替换:
PROJECT_ID
:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如my-project
。-
PRIV_SA
:为其创建短期令牌且具有相应权限的服务帐号的电子邮件地址。 POLICY_VERSION
:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本。-
POLICY
:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考。例如,要设置上一步中显示的允许政策,请将
POLICY
替换为以下内容,其中CALLER_SA
是创建短期令牌的服务帐号:{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/serviceAccountAdmin", "members": [ "user:admin@example.com" ] }, { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:CALLER_SA" ] } ] }
HTTP 方法和网址:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA
请求 JSON 正文:
{ "policy": POLICY }
如需发送您的请求,请展开以下选项之一:
响应包含更新后的允许政策。
请求短期有效凭据
为每种身份授予适当的角色后,您便可以请求所需服务帐号的短期有效凭据。系统支持以下几种凭据类型:
本部分中的示例要求您使用用户帐号。
生成 OAuth 2.0 访问令牌
您可以使用 gcloud CLI、REST API 或 Cloud 客户端库和 Google API 客户端库生成 OAuth 2.0 访问令牌。
如果您使用 REST API,并且您的系统配置为允许延长令牌生命周期,则可以创建一个生命周期长于默认值的令牌。Google Cloud CLI 不支持为令牌设置生命周期。
以下示例适合在本地开发环境中使用;调用方必须由用户帐号(而不是服务帐号)表示。
如需为具有权限的服务帐号生成 OAuth 2.0 访问令牌,请执行以下操作:
gcloud
以调用方 Google 帐号的身份登录 Google Cloud CLI。
gcloud auth login CALLER_ACCOUNT
模拟拥有相应权限的服务帐号来生成令牌。
gcloud auth print-access-token
命令可为服务帐号生成 OAuth 2.0 访问令牌。在使用下面的命令数据之前,请先进行以下替换:
-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud auth print-access-token --impersonate-service-account=PRIV_SA
Windows (PowerShell)
gcloud auth print-access-token --impersonate-service-account=PRIV_SA
Windows (cmd.exe)
gcloud auth print-access-token --impersonate-service-account=PRIV_SA
您应该会收到类似如下所示的响应:
WARNING: This command is using service account impersonation. All API calls will be executed as [my-sa@my-project.iam.gserviceaccount.com]. ya29.c.b0AXv0zTPnzTnDV8F8Aj5Fgy46Yf2v_v8eZIoKq7xGpfbpXuy23aQ1693m3gAuE8AZga7w6kdagN7a9bfdDYbdeoGY0CMHOClsCwIdutL7k_RFC672lOCbUgF5hS8Iu2nCA8hle-11LJXBLmaxFmH08ZTBJLuDrWSNd8cYqGYFunSC1K1qLIPBF18tsa0hxVgKPucI8b1A9L8_MK1JGLGcr0n7-zY77_lmbcdODG3NmIbLOGWOutjJgqSO_YoeCKK2QTUZIp5PG7RkKlXWnmYJA9pEahzNoQrs5sWZctc2bia9af_ITzqqlXC9h1Kj5-me6e8rd734MJvpagqYazRk0gGWpMb03XmMGpgPc_FBp4pnX9rGOzW83SNpcDz8zeFO1Q0Bo3N7CuZougjRce0y8I2_4rtw5ME_nV3wrCWa..................................................................................................................................................................................................................................................................................................
-
REST
Service Account Credentials API 的 serviceAccounts.generateAccessToken
方法为服务帐号生成 OAuth 2.0 访问令牌。
在使用任何请求数据之前,请先进行以下替换:
-
PRIV_SA
:为其创建短期令牌且具有相应权限的服务帐号的电子邮件地址。 -
LIFETIME
:访问令牌到期前的时间量(以秒为单位)。例如300s
。默认情况下,令牌的最长生命周期为 1 小时(3600 秒)。如需将这些令牌的最长生命周期延长至 12 小时(43200 秒),请将服务帐号添加到组织政策中(该政策包含
constraints/iam.allowServiceAccountCredentialLifetimeExtension
列表限制条件)。
HTTP 方法和网址:
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateAccessToken
请求 JSON 正文:
{ "scope": [ "https://www.googleapis.com/auth/cloud-platform" ], "lifetime": "LIFETIME" }
如需发送您的请求,请展开以下选项之一:
如果 generateAccessToken
请求成功,响应正文会包含一个 OAuth 2.0 访问令牌和一个到期时间。然后,便可以使用 accessToken
代表服务帐号验证请求,直至到达 expireTime
时限:
{ "accessToken": "eyJ0eXAi...NiJ9", "expireTime": "2020-04-07T15:01:23.045123456Z" }
生成 OpenID Connect ID 令牌
您可以使用 gcloud CLI、REST API 或 Cloud 客户端库和 Google API 客户端库生成 OpenID Connect (OIDC) ID 令牌。
以下示例适合在本地开发环境中使用;调用方必须由用户帐号(而不是服务帐号)表示。
OIDC ID 令牌的有效期为 1 小时(3600 秒)。
如需为具有权限的服务帐号生成 Google 签名的 OIDC ID 令牌,请执行以下操作:
gcloud
以调用方 Google 帐号的身份登录 Google Cloud CLI。
gcloud auth login CALLER_ACCOUNT
模拟拥有相应权限的服务帐号来生成令牌。
gcloud auth print-identity-token
命令会为服务帐号生成 OIDC ID 令牌。在使用下面的命令数据之前,请先进行以下替换:
-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。 -
AUDIENCE_NAME
:令牌的受众群体,通常是令牌将用于访问的应用或服务的网址。
执行以下命令:
Linux、macOS 或 Cloud Shell
gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"
Windows (PowerShell)
gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"
Windows (cmd.exe)
gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"
您应该会收到类似如下所示的响应:
WARNING: This command is using service account impersonation. All API calls will be executed as [my-sa@my-project.iam.gserviceaccount.com]. eyJhbGciOiJSUzI1NiIsImtpZDNhMDg4ZDRmZmMjJkYTVmZTM5MDZjY2MiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJ3d3cuZXhhbXBsJhenAiOiIxMTYzwNDYyMDk0ODIiLCJleHAiOjE2NTQ4ODU0MzEsImlhdCI6MTY1NDg4MTgzMSwiaXN6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIMDQ2MjA5NDgyIn0.F7mu8IHj5VQdu7ItFrnYAKyGd7YqXuOP_rFLc98q8BaFBycAF1zAQnSnwqnSUXba0UK9PDT_-IOry68qLwBObz4XlX9lk0ehpN0O0W9FcFToKLB6wefXXPd4h7xtuPe5KzmpSOqj2Qqv34HriGw00Nqd-oGSgNY_lZ4wGEf4rT4oQa_kEcrY57Q2G6pwd769BhgeFwoLi5aK_Cv2kvf_zfMszC-xlkP9zwWQ8XinJBwe-qcQBa4NTgrbueNtXsEjccBS366zmw
-
REST
Service Account Credentials API 的 serviceAccounts.generateIdToken
方法为服务帐号生成 OIDC ID 令牌。
在使用任何请求数据之前,请先进行以下替换:
-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。 -
AUDIENCE_NAME
:令牌的受众群体,通常是令牌将用于访问的应用或服务的网址。
HTTP 方法和网址:
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateIdToken
请求 JSON 正文:
{ "audience": "AUDIENCE_NAME", "includeEmail": "true" }
如需发送您的请求,请展开以下选项之一:
如果 generateId
请求成功,则响应正文会包含一个有效期为 1 小时的 ID 令牌。然后,便可以使用 token
代表服务帐号验证请求:
{ "token": "eyJ0eXAi...NiJ9" }
创建自签名 JSON Web 令牌 (JWT)
自签名 JSON Web 令牌 (JWT) 在各种场景中都很有用,例如:
- 按照 Google 的身份验证指南中的说明验证对 Google API 的调用。
- 在 Google Cloud 或非 Google 服务(例如在 App Engine 上运行的应用)之间安全地进行通信。在此场景中,一个应用可对一个令牌签名,而在进行身份验证时,该令牌可以由另一个应用进行验证。
- 通过签署包含有关用户、帐号或设备的任意声明的 JWT,将服务帐号视为身份提供方。
如需运行以下示例,您必须使用用户帐号作为调用方凭据。
如需为具有权限的服务帐号生成自签名 JWT,请执行以下操作:
REST
Service Account Credentials API 的 serviceAccounts.signJwt
方法使用服务帐号的系统管理私钥来对 JWT 进行签名。
在使用任何请求数据之前,请先进行以下替换:
-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。 -
JWT_PAYLOAD
:需要签名的 JWT 载荷,它是一个包含 JWT 声明集的 JSON 对象。包含您所需用例必需的且满足您要调用的服务验证要求必需的声明。如果您要调用 Google API,请参阅 Google 的身份验证指南了解声明要求。exp
(到期时间)声明不得超过未来 12 小时。如果您要调用 Google API,则exp
声明必须设置为不超过未来 1 小时。以下示例载荷包含调用 Google API 的声明,其中
EXP
是表示到期时间的整数时间戳:{ \"iss\": \"PRIV_SA", \"sub\": \"PRIV_SA\", \"aud\": \"https://firestore.googleapis.com/\", \"iat\": 1529350000, \"exp\": EXP }
HTTP 方法和网址:
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signJwt
请求 JSON 正文:
{ "payload": "JWT_PAYLOAD" }
如需发送您的请求,请展开以下选项之一:
如果 signJwt
请求成功,则响应正文会包含已签名的 JWT 以及用于签署 JWT 的签名密钥 ID。您可以将 signedJwt
值用作不记名令牌,以代表服务帐号直接验证请求。令牌在请求中指定的到期时间内有效:
{ "keyId": "42ba1e...fc0a", "signedJwt": "eyJ0eXAi...NiJ9" }
创建自签名 blob
如需运行以下示例,您必须使用用户帐号作为调用方凭据。
如需为具有权限的服务帐号生成自签名 blob,请执行以下操作:
REST
Service Account Credentials API 的 serviceAccounts.signBlob
方法使用服务帐号的系统管理私钥来对 blob 进行签名。
在使用任何请求数据之前,请先进行以下替换:
-
PRIV_SA
:为其创建短期令牌的具有权限的服务帐号的电子邮件地址。 -
BLOB_PAYLOAD
:Base64 编码的字节串。例如,VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu
。
HTTP 方法和网址:
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signBlob
请求 JSON 正文:
{ "payload": "BLOB_PAYLOAD" }
如需发送您的请求,请展开以下选项之一:
如果 signBlob
请求成功,则响应正文会包含已签名的 blob 以及用于签署 blob 的签名密钥 ID。您可以将 signedBlob
值用作不记名令牌,以代表服务帐号直接验证请求。在服务帐号的系统管理私钥到期之前,该令牌有效。此密钥的 ID 是响应中 keyId
字段的值。
{ "keyId": "42ba1e...fc0a", "signedBlob": "eyJ0eXAi...NiJ9" }