如何通过编程访问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
相关产品推荐
相关产品推荐

