You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Google服务账号密钥文件获取Access Token?解决Python调用AutoML模型预测端点的AttributeError问题

解决AttributeError并获取服务账号Access Token的正确方式

先说说你碰到的错误原因

你遇到的AttributeError: 'Credentials' object has no attribute 'get_access_token'是因为service_account.Credentials实例本身并没有这个方法。官方的google-auth库提供了其他规范的方式来获取访问令牌,另外还有更省心的方法调用AutoML预测端点,不用自己手动处理认证细节。


方案一:修复手动调用端点的代码(手动管理令牌)

你的原始代码里漏了jsonrequests的导入,还有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客户端库,它会自动处理认证、令牌刷新等所有细节,代码更简洁可靠:

  1. 先安装库:
pip install google-cloud-aiplatform
  1. 使用客户端库的代码:
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.json
    
    然后打印访问令牌:
    gcloud auth application-default print-access-token
    

内容的提问来源于stack exchange,提问作者Bill Software Engineer

火山引擎 最新活动