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

如何通过编程访问GCP受IAP保护的网站API且不使用服务账号密钥?

解决方案

方案1:直接使用gcloud命令生成认证令牌(最简单)

不需要自己写代码实现OAuth逻辑,gcloud已经内置了IAP认证的适配,直接执行以下命令即可生成可用的id_token:

gcloud auth print-identity-token --audiences=<替换为你的IAP客户端ID>

生成的令牌直接添加到API请求的Header中即可使用:

Authorization: Bearer <生成的令牌>

该方法自动处理了同项目客户端ID的校验逻辑,不会触发同项目客户端校验的报错。

方案2:使用Google官方auth库实现代码侧认证

如果需要在代码中自动获取令牌,不要手动封装OAuth请求,直接使用官方google-auth库的内置方法即可,适配IAP场景的示例代码如下:

from google.oauth2 import id_token
from google.auth.transport.requests import Request

def get_iap_id_token(audience: str) -> str:
    # 自动加载本地的application_default_credentials
    request = Request()
    # 内置适配IAP的令牌获取逻辑,自动处理校验规则
    return id_token.fetch_id_token(request, audience)

# 调用示例,替换为你的IAP客户端ID
if __name__ == "__main__":
    IAP_CLIENT_ID = "73XXXXXXX"
    token = get_iap_id_token(IAP_CLIENT_ID)
    # 后续请求携带该令牌即可
    print(token)

自定义OAuth请求报错的原因是,手动构造的OAuth请求没有兼容GCP对用户账户访问IAP的特殊校验规则,官方库已经内置了这部分适配逻辑,不需要手动传递client_id、client_secret等参数。

前置校验项

如果执行上述操作仍有问题,请先确认以下配置:

  • 本地登录的用户账号,已经被授予目标资源的IAP-secured Web App User角色
  • 填写的audience参数和IAP后台展示的客户端ID完全一致,没有拼写错误
  • 可以先清除本地旧凭证后重新登录,避免缓存的凭证异常:
    rm ~/.config/gcloud/application_default_credentials.json
    gcloud auth application-default login --scopes=openid,email,profile
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:21:00