You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中获取默认服务账号的通用身份令牌?

获取默认服务账号通用Cloud Function身份令牌的编程实现

Google身份令牌的受众(audience)可以指定为项目级的Cloud Function根域名格式:https://{PROJECT_ID}.cloudfunctions.net/,这个受众能匹配该项目下所有Cloud Function的请求(因为CF的URL均为https://{PROJECT_ID}.cloudfunctions.net/{FUNCTION_NAME},令牌的audience前缀匹配即可通过认证)。下面提供几种等价于gcloud auth print-identity-token的编程实现方法:


方法1:使用google-auth-library(推荐,跨场景)

你之前对库的用法存在误解——google-auth-library并不强制要求传入单个CF URL,只需指定项目级通用受众即可。Python示例如下:

from google.oauth2 import id_token
from google.auth.transport import requests

PROJECT_ID = "你的项目ID"
# 项目级通用受众,匹配所有该项目下的Cloud Function
AUDIENCE = f"https://{PROJECT_ID}.cloudfunctions.net/"

# 自动适配环境:GCP内部环境用默认服务账号身份,外部环境用gcloud授权或服务账号密钥
token = id_token.fetch_id_token(requests.Request(), AUDIENCE)

print(token)

注意:

  • 运行在GCP内部环境(Cloud Function、GCE、GKE等)时,无需额外配置,自动使用默认服务账号。
  • 本地或外部环境运行时,需先执行gcloud auth application-default login授权,或设置GOOGLE_APPLICATION_CREDENTIALS环境变量指向服务账号密钥文件。

方法2:直接调用Metadata服务器(仅GCP内部环境)

如果代码运行在GCP内部资源上,可直接向Metadata服务器请求令牌,无需依赖第三方库,逻辑和gcloud命令完全一致:

import requests

PROJECT_ID = "你的项目ID"
AUDIENCE = f"https://{PROJECT_ID}.cloudfunctions.net/"

metadata_endpoint = f"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience={AUDIENCE}"
headers = {"Metadata-Flavor": "Google"}

response = requests.get(metadata_endpoint, headers=headers)
token = response.text

print(token)

方法3:调用IAM Credentials API(灵活控制场景)

若需要指定特定服务账号、自定义令牌有效期等高级操作,可直接调用IAM Credentials API的generateIdToken方法:

前置要求

  • 执行身份(默认服务账号或本地授权账号)需拥有iam.serviceAccounts.generateIdToken权限。

Python代码示例

from google.cloud import iam_credentials_v1

PROJECT_ID = "你的项目ID"
SERVICE_ACCOUNT_EMAIL = f"{PROJECT_ID}@appspot.gserviceaccount.com"
AUDIENCE = f"https://{PROJECT_ID}.cloudfunctions.net/"

client = iam_credentials_v1.IAMCredentialsClient()
resource_name = f"projects/-/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}"

response = client.generate_id_token(
    name=resource_name,
    audience=AUDIENCE,
    include_email=True
)

token = response.token
print(token)

额外配置:可通过lifetime参数设置令牌有效期(单位秒,默认3600秒)。


令牌验证

生成令牌后,可通过以下命令验证其有效性:

gcloud auth verify-id-token <你的令牌> --audience=https://{PROJECT_ID}.cloudfunctions.net/

内容的提问来源于stack exchange,提问作者Renee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:25:22