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

如何在GCP中通过UI或Python API延长access token的有效期

GCP VM服务账号访问令牌过期问题解决方案

通过GCE元数据服务器获取的默认服务账号访问令牌有效期固定为3600秒,不支持直接修改expires_in参数自定义延长,可通过以下方案解决长时训练场景的令牌过期问题:

方案1:实现令牌自动刷新逻辑(优先推荐)

无需额外配置,仅需在代码中封装令牌获取逻辑,在令牌即将过期时自动从元数据服务器拉取新的有效令牌,无权限配置和密钥泄露风险。
示例代码:

import requests
import time

class GCEMetadataTokenManager:
    def __init__(self, buffer_seconds=300):
        self.token = None
        self.expire_timestamp = 0
        # 提前300秒刷新令牌,避免边界情况下的认证失败
        self.refresh_buffer = buffer_seconds
        self.metadata_url = "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
        self.req_headers = {"Metadata-Flavor": "Google"}
    
    def get_valid_token(self):
        # 令牌已过期或即将过期时触发刷新
        if time.time() > self.expire_timestamp - self.refresh_buffer:
            resp = requests.get(self.metadata_url, headers=self.req_headers)
            resp.raise_for_status()
            token_data = resp.json()
            self.token = token_data["access_token"]
            self.expire_timestamp = time.time() + token_data["expires_in"]
        return self.token

# 调用示例
token_manager = GCEMetadataTokenManager()
# 每次发起API请求前调用get_valid_token方法获取有效令牌
api_headers = {
    "Authorization": f"Bearer {token_manager.get_valid_token()}"
}

方案2:使用服务账号密钥生成自定义有效期令牌

如果需要更长的单次令牌有效期,可使用服务账号密钥文件生成最长12小时(43200秒)的访问令牌,超出12小时的场景可搭配自动刷新逻辑使用。
示例代码:

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

# 替换为你的服务账号密钥本地路径
SA_KEY_PATH = "/path/to/your-service-account-key.json"
# TPU操作所需的权限范围
API_SCOPES = ["https://www.googleapis.com/auth/cloud-platform"]
# 自定义有效期,最大值为43200秒(12小时)
CUSTOM_EXPIRE_SECONDS = 43200

# 初始化凭证
credentials = service_account.Credentials.from_service_account_file(
    SA_KEY_PATH,
    scopes=API_SCOPES
)
# 生成指定有效期的令牌
req = google.auth.transport.requests.Request()
credentials.refresh(req, expires_in=CUSTOM_EXPIRE_SECONDS)

# 获取令牌
access_token = credentials.token

方案3:使用GCP官方客户端库(最省事)

GCP官方提供的各服务SDK默认内置了令牌自动刷新逻辑,无需自行管理令牌的获取和刷新,直接调用对应接口即可。
关停TPU示例代码:

from google.cloud import tpu_v2

# 初始化客户端,自动处理认证逻辑
tpu_client = tpu_v2.TpuClient()

# 替换为你的项目、可用区、TPU实例名称信息
project_id = "your-project-id"
zone = "us-central1-a"
tpu_node_name = "your-tpu-name"

node_full_name = f"projects/{project_id}/locations/{zone}/nodes/{tpu_node_name}"
# 发起删除TPU请求
delete_op = tpu_client.delete_node(name=node_full_name)
# 等待操作完成
delete_op.result()
print(f"TPU实例 {tpu_node_name} 已成功关停")

注意事项

  • 方案1无需额外密钥,仅需VM绑定的服务账号拥有TPU操作权限即可,安全性最高
  • 方案2需要妥善保管服务账号密钥文件,避免泄露造成安全风险
  • 所有方案均无需修改GCP平台配置,元数据服务器返回的令牌固定有效期不可手动调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:27:02