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

使用Google Auth Library for Python对接Cloud Endpoints遇JWT格式错误求标准库实现

使用Google Auth Library for Python实现Cloud Endpoints认证

当然可以用Google Auth Library for Python来完成这个认证流程,而且这才是官方推荐的最佳实践——不仅能避开手动构建JWT时容易踩的格式坑,还能享受库自带的凭据自动刷新、安全签名、默认凭据获取等优势,比手动写代码靠谱多了。

为什么你之前会遇到BAD_FORMAT错误?

手动构建JWT时很容易在细节上出错:比如payload里的aud(受众)字段没设成Cloud Endpoints的服务名、签名算法不符合要求、JWT结构拼接错误,这些都会触发ESP的格式验证失败。而Google Auth Library会自动处理这些合规细节,生成完全符合要求的JWT。

具体实现步骤

1. 安装依赖

首先确保安装了必要的库:

pip install google-auth google-auth-httplib2

如果习惯用requests库发送请求,还可以补充安装适配库:

pip install google-auth-transport-requests

2. 代码实现(两种HTTP客户端示例)

示例1:使用httplib2(适配App Engine原生环境)
import google.auth
from google.auth.transport.httplib2 import AuthorizedHttp
from google.oauth2 import id_token

# 替换成你的Cloud Endpoints服务名(格式如 xxx.endpoints.your-project-id.cloud.goog)
ENDPOINTS_SERVICE_NAME = "your-endpoints-service-name"
# 替换成你的Endpoints API实际地址
ENDPOINTS_API_URL = "https://your-compute-engine-ip/your-api-endpoint"

def call_endpoints_api():
    # 获取App Engine默认的服务账号凭据
    credentials, project_id = google.auth.default()
    
    # 自动生成符合ESP验证要求的JWT(自动处理签名、aud字段等关键细节)
    valid_jwt = id_token.fetch_id_token(credentials, ENDPOINTS_SERVICE_NAME)
    
    # 构建带认证的HTTP客户端
    auth_http = AuthorizedHttp(credentials)
    # 手动添加Authorization头(Endpoints需要ID Token作为Bearer令牌)
    headers = {"Authorization": f"Bearer {valid_jwt}"}
    
    # 发送请求并处理响应
    response, content = auth_http.request(ENDPOINTS_API_URL, method="GET", headers=headers)
    
    print(f"请求状态码: {response.status}")
    print(f"响应内容: {content.decode('utf-8')}")
    return response, content
示例2:使用requests(代码更简洁)
import google.auth
from google.auth.transport.requests import AuthorizedSession
from google.oauth2 import id_token

ENDPOINTS_SERVICE_NAME = "your-endpoints-service-name"
ENDPOINTS_API_URL = "https://your-compute-engine-ip/your-api-endpoint"

def call_endpoints_with_requests():
    credentials, project_id = google.auth.default()
    # 获取针对Endpoints服务的有效JWT
    valid_jwt = id_token.fetch_id_token(credentials, ENDPOINTS_SERVICE_NAME)
    
    # 创建授权会话,注入Authorization头
    session = AuthorizedSession(credentials)
    session.headers.update({"Authorization": f"Bearer {valid_jwt}"})
    
    # 发送请求并处理响应
    response = session.get(ENDPOINTS_API_URL)
    response.raise_for_status()  # 自动抛出HTTP错误
    print("响应结果:", response.json())
    return response.json()

关键注意事项

  • 服务名必须完全匹配:ENDPOINTS_SERVICE_NAME要和你Cloud Endpoints配置(OpenAPI文档或ESP配置)里的service字段完全一致,否则JWT的受众验证会失败。
  • 权限配置要到位:确保App Engine的默认服务账号拥有访问Cloud Endpoints服务的权限,比如在IAM中给该账号添加Cloud Endpoints Invoker角色。
  • 无需手动管理密钥:Google Auth Library会自动获取App Engine的默认服务账号凭据,不用手动处理密钥文件,安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:05:03