You need to enable JavaScript to run this app. 使用API密钥调用Google AI Platform预测接口遇401错误的可移植方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用API密钥调用Google AI Platform预测接口遇401错误的可移植方案咨询

核心问题根源
  • 你持续收到401响应的最直接原因:Google AI Platform的在线预测接口(即ml.googleapis.com域下的predict端点)本身就不支持通过URL拼接?key=API_KEY的方式完成认证。
  • 你参考的自然语言处理类API支持API Key认证,是因为这类属于面向开放场景的公共消费级接口;而AI Platform预测接口属于受项目IAM权限管控的资源类接口,API Key本身不携带任何身份权限信息,自然无法通过接口的身份校验流程。
适配你需求的无环境变量依赖调用方案

你提出的不依赖环境变量配置、直接在请求中传入认证参数、保证方案可移植性的需求,完全可以通过手动生成认证头的方式实现,不需要依赖Google官方SDK自动读取环境变量的逻辑:

  1. 前期准备
    • 在目标项目下创建一个具备AI Platform Predictor权限的服务账号,下载该账号的JSON格式密钥文件,将文件内容直接内嵌到应用代码中,无需依赖本地环境变量、本地文件挂载等运行环境配置。
  2. 认证实现逻辑
    • 通过代码直接读取内嵌的服务账号密钥,手动生成有效期1小时的短期OAuth2访问令牌,整个令牌生成流程完全在应用内部完成,不依赖任何运行环境的预装组件。
    • 将生成的令牌按规范格式写入请求头的Authorization字段,格式为Authorization: Bearer <生成的访问令牌>,完全符合直接传入认证参数的要求,适配跨平台部署的可移植性需求。
  3. 修正原代码的语法错误
    • 原代码中存在拼写错误:导入库名为requests,但实际调用时写的是request.post,会直接触发运行时错误。
    • 原API URL存在语法疏漏,需保证完整路径无缺失、无格式错误,正确格式为:https://ml.googleapis.com/v1/projects/你的项目ID/models/你的模型名称/versions/v2:predict
可直接复用的参考代码

代码运行前需要安装依赖包:pip install pyjwt[crypto] requests cryptography
以下为无环境变量依赖、全流程代码内嵌的实现示例:

import time
import jwt
import requests
from cryptography.hazmat.primitives import serialization

# 直接内嵌服务账号密钥内容,无需依赖外部配置
SERVICE_ACCOUNT_CONFIG = {
  "type": "service_account",
  "project_id": "你的项目ID",
  "private_key_id": "对应密钥的ID值",
  "private_key": "从下载的JSON密钥中完整复制私钥内容,注意保留格式转义",
  "client_email": "你的服务账号邮箱@对应项目.iam.gserviceaccount.com",
  "client_id": "对应服务账号的客户端ID",
  "token_uri": "https://oauth2.googleapis.com/token"
}

def generate_access_token():
    # 构造签名用JWT
    current_time = int(time.time())
    jwt_payload = {
        "iss": SERVICE_ACCOUNT_CONFIG["client_email"],
        "scope": "https://www.googleapis.com/auth/cloud-platform",
        "aud": SERVICE_ACCOUNT_CONFIG["token_uri"],
        "iat": current_time,
        "exp": current_time + 3600
    }
    # 用服务账号私钥完成JWT签名
    private_key = serialization.load_pem_private_key(
        SERVICE_ACCOUNT_CONFIG["private_key"].encode(),
        password=None
    )
    signed_jwt = jwt.encode(jwt_payload, private_key, algorithm="RS256")
    # 向令牌服务换取短期访问令牌
    token_response = requests.post(
        SERVICE_ACCOUNT_CONFIG["token_uri"],
        data={
            "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
            "assertion": signed_jwt
        }
    )
    return token_response.json()["access_token"]

# 发起正式预测请求
bearer_token = generate_access_token()
predict_url = "https://ml.googleapis.com/v1/projects/你的项目ID/models/你的模型名称/versions/v2:predict"
request_headers = {
    "Authorization": f"Bearer {bearer_token}",
    "Content-Type": "application/json"
}
request_payload = {"instances": [ {"input_1": ["Please predict this text"]}]}

response = requests.post(predict_url, headers=request_headers, json=request_payload)
print(response.json())
常见踩坑提示
  • 不要尝试通过给API Key绑定项目权限的方式绕过认证:ML预测接口的权限校验逻辑只识别请求头中的Bearer令牌,完全不解析URL中的key参数,无论key权限配置多高,都无法通过校验,必然返回401。
  • 生成的短期访问令牌有效期仅为1小时,需要在代码中实现过期自动刷新逻辑,不要将硬编码的令牌作为固定参数长期使用。
  • 如果模型已迁移至新的Vertex AI托管环境,仅需替换对应预测接口的URL,上述认证逻辑可以完全复用,无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 08:15:04