Google Ads API授权报错:google.auth.exceptions.RefreshError: Invalid Client
Google Ads API调用触发invalid_client错误的排查
我正在开发一个项目,流程是让客户授权其Google Ads账户,之后用授权凭证代客户下载数据。目前Web应用已完成授权流程,通过授权码兑换到了access token和refresh token,将refresh token存入数据库后,由另一个应用尝试调用Google Ads API。
按照Google OAuth机制,理论上仅需refresh token即可完成授权,但使用GoogleAdsClient类的load_from_dict()或load_from_env()方法时,始终抛出相同错误:
google.auth.exceptions.RefreshError: ('invalid_client: Unauthorized', {'error': 'invalid_client', 'error_description': 'Unauthorized'})
我已经验证了developer_token、client_id、client_secret均与API控制台信息完全一致,且refresh_token已正确传入凭证字典。查阅大量相关资料后仍无法解决问题。
相关代码:
class GoogleAds: def __init__(self): self.scope = ['https://www.googleapis.com/auth/adwords'] self.client_id = os.getenv('GOOGLE_ADS_CLIENT_ID') self.client_secret = os.getenv('GOOGLE_ADS_CLIENT_SECRET') self.developer_token = os.getenv('GOOGLE_ADS_DEVELOPER_TOKEN') self.refresh_token = os.getenv('GOOGLE_ADS_REFRESH_TOKEN') def authorize(self): credentials = { "developer_token": self.developer_token, "refresh_token": self.refresh_token, "client_id": self.client_id, "client_secret": self.client_secret, "use_proto_plus":"True", "grant_type": "refresh_token", } print(credentials) googleads_client = GoogleAdsClient.load_from_dict(credentials) service = googleads_client.get_service("GoogleAdsService") request = googleads_client.get_type("SearchGoogleAdsRequest") return service, request
排查建议
- 核对OAuth客户端类型:生成refresh token时使用的客户端类型(如Web应用、桌面应用)必须与当前调用API的客户端ID类型完全一致,类型不匹配会直接触发invalid_client错误。
- 验证refresh token有效性:尝试通过新的授权流程生成全新的refresh token进行测试,排查原token是否因用户重新授权、密码变更或客户端密钥重置而失效。
- 确认环境变量加载正确性:直接打印
self.client_id、self.client_secret等变量的实际值,排查是否存在环境变量未加载、值包含多余空格或转义字符的问题。 - 检查API启用与权限:确认Google Ads API已在API控制台中启用,且developer_token对应的账号拥有标准访问权限(测试权限无法调用正式API)。
- 移除冗余参数:删除credentials字典中的
grant_type: "refresh_token"参数,GoogleAdsClient会自动处理OAuth刷新流程,该参数属于冗余配置。
内容的提问来源于stack exchange,提问作者Garrett Berg
相关产品推荐
相关产品推荐

