如何从Google服务账号密钥文件获取Access Token?解决Python调用AutoML模型预测端点的AttributeError问题
解决AttributeError并获取服务账号Access Token的正确方式
先说说你碰到的错误原因
你遇到的AttributeError: 'Credentials' object has no attribute 'get_access_token'是因为service_account.Credentials实例本身并没有这个方法。官方的google-auth库提供了其他规范的方式来获取访问令牌,另外还有更省心的方法调用AutoML预测端点,不用自己手动处理认证细节。
方案一:修复手动调用端点的代码(手动管理令牌)
你的原始代码里漏了json和requests的导入,还有header参数名写错了(应该是headers),另外需要用正确的方式刷新凭据获取令牌。修正后的代码如下:
import json import requests from google.oauth2 import service_account from google.auth.transport.requests import Request project_id = 'aaa' endpoint_id = 'bbb' # 加载服务账号密钥文件 with open('./ServiceAccountKey.json') as source: info = json.load(source) # 创建带作用域的凭据 credentials = service_account.Credentials.from_service_account_info(info) scoped_credentials = credentials.with_scopes(['https://www.googleapis.com/auth/cloud-platform']) # 刷新凭据以获取有效访问令牌 scoped_credentials.refresh(Request()) access_token = scoped_credentials.token # 构建稳定版的预测端点URL(v1alpha1是测试版,推荐用v1) endpoint = f"https://us-central1-aiplatform.googleapis.com/v1/projects/{project_id}/locations/us-central1/endpoints/{endpoint_id}:predict" # 设置请求头 headers = { "Content-Type": "application/json", "Authorization": f"Bearer {access_token}" } # 替换为你的模型所需的预测输入数据,示例格式 payload = json.dumps({ "instances": [ {"feature1": 1.2, "feature2": 3.4} # 这里根据你的模型输入结构调整 ] }) # 发送预测请求 response = requests.post(endpoint, data=payload, headers=headers) print("响应状态码:", response.status_code) print("预测结果:", response.json())
关键细节说明:
- 通过
scoped_credentials.refresh(Request())触发凭据刷新,之后scoped_credentials.token就是有效的访问令牌,这是官方推荐的手动获取令牌的方式。 - 端点URL建议用
v1版本,v1alpha1是预发布版本,功能可能不稳定。
方案二:使用官方AI Platform客户端库(推荐,无需手动管理令牌)
Google提供了google-cloud-aiplatform客户端库,它会自动处理认证、令牌刷新等所有细节,代码更简洁可靠:
- 先安装库:
pip install google-cloud-aiplatform
- 使用客户端库的代码:
from google.cloud import aiplatform from google.oauth2 import service_account project_id = 'aaa' endpoint_id = 'bbb' location = 'us-central1' # 加载服务账号凭据 credentials = service_account.Credentials.from_service_account_file('./ServiceAccountKey.json') # 初始化AI Platform客户端 aiplatform.init( project=project_id, location=location, credentials=credentials ) # 获取目标端点 endpoint = aiplatform.Endpoint(endpoint_id) # 发送预测请求,替换为你的输入数据 predictions = endpoint.predict( instances=[ {"feature1": 1.2, "feature2": 3.4} # 根据模型输入结构调整 ] ) # 打印预测结果 print("预测结果:", predictions)
如何从服务账号密钥文件获取Access Token?
有两种常用方式:
- 方式一:通过代码获取(如方案一所示)
使用google-auth库创建凭据实例,调用refresh(Request())刷新后,通过credentials.token获取有效令牌,令牌会在过期前自动刷新。 - 方式二:通过gcloud命令行获取(本地已安装gcloud工具时)
先激活你的服务账号:
然后打印访问令牌:gcloud auth activate-service-account --key-file=./ServiceAccountKey.jsongcloud auth application-default print-access-token
内容的提问来源于stack exchange,提问作者Bill Software Engineer




