如何在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
相关产品推荐
相关产品推荐

