如何从google.oauth2.Credentials获取GCP AI平台调用所需的Access Token
解决方案
一、获取可用Access Token的方法
你拿到的credentials.token为空是因为Google服务账号凭证对象默认不会主动触发token拉取,需要手动调用refresh方法完成认证,示例代码如下:
from google.oauth2 import service_account from google.auth.transport.requests import Request # 加载本地服务账号密钥文件 credentials = service_account.Credentials.from_service_account_file( '/path/to/key.json', scopes=['https://www.googleapis.com/auth/cloud-platform'] ) # 凭证无效/无token时主动刷新获取 if not credentials.valid or credentials.token is None: credentials.refresh(Request()) access_token = credentials.token
注意:Access Token默认有效期为1小时,过期后需要重新调用refresh方法刷新,不要长期缓存同一个token使用。
二、适配异步场景的更优实现方案
因为你使用的是Twisted异步服务,直接调用同步的credentials.refresh()会阻塞事件循环,推荐两种更适配的方案:
- 方案1:本地部署场景(服务运行在GCP外部)
单独启一个定时任务,每50分钟(提前于1小时有效期)在独立线程中刷新一次token,存入全局变量,所有异步请求直接读取全局缓存的有效token即可,避免每次请求都刷新、避免阻塞事件循环。 - 方案2:GCP内部部署场景(服务运行在GCE/GKE/Cloud Run等GCP服务上)
不需要加载本地服务账号密钥,直接用异步HTTP客户端请求GCP元数据接口获取token,完全异步不阻塞,请求信息如下:- 请求地址:
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token - 请求Header:
Metadata-Flavor: Google
拿到返回的token后同样可以做定时缓存,不用每次请求都调用元数据接口。
- 请求地址:
获取token后调用GCP AI Platform预测接口时,只需要在请求头中添加Authorization: Bearer <你的access_token>,请求体和TensorFlow Serving的REST预测格式完全一致即可正常拿到返回结果。
内容的提问来源于stack exchange,提问作者justnoxx
相关产品推荐
相关产品推荐

