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

Google Cloud IAP使用Bearer令牌授权报13错误,App Engine实例未被访问

解决Cloud IAP程序化认证返回错误码13的问题

看起来你遇到的是IAP程序化认证的典型问题——Web端正常是因为IAP帮你处理了完整的OAuth流程,但程序化调用需要手动确保凭证的正确性,错误码13通常指向认证凭证无效,而且因为IAP在请求到达App Engine前就拦截了认证,所以你的实例根本不会收到请求,这也符合你看到的现象。下面是一步步的排查和解决方法:

1. 优先检查id_token的受众(aud)字段是否匹配

这是最常见的原因!Web端的IAP流程会自动用正确的audience生成凭证,但程序化获取id_token时如果没指定,默认的aud是Google API的,不是你的IAP客户端ID,直接导致IAP拒绝。

  • 命令行验证:用这个命令生成带正确audience的id_token,再解析看看:

    # 替换成你的IAP客户端ID
    gcloud auth print-identity-token --audiences=YOUR_IAP_CLIENT_ID
    

    把输出的token复制到本地的JWT解析工具里(比如本地运行的解析脚本、离线解析工具),检查aud字段是否和你的IAP客户端ID完全一致。

  • iOS SDK验证:如果用GoogleSignIn或GTMAppAuth,确保在配置时指定了IAP的客户端ID作为audience。比如用GIDConfiguration:

    let config = GIDConfiguration(clientID: "YOUR_APP_CLIENT_ID", serverClientID: "YOUR_IAP_CLIENT_ID")
    GIDSignIn.sharedInstance.configuration = config
    

    获取id_token时,要确保返回的token的aud是你的IAP客户端ID。

2. 确认IAP客户端ID的正确性

去Google Cloud Console的IAP页面,找到你的App Engine应用对应的OAuth客户端ID(格式是xxxxxx.apps.googleusercontent.com),这个就是你需要在程序化认证中指定的audience值,别和你的移动端App的客户端ID搞混了!

3. 检查请求的Authorization头格式

发送请求时必须严格遵循格式:

Authorization: Bearer YOUR_ID_TOKEN

注意Bearer后面有一个空格,id_token不能有任何截断或额外字符,很多时候拼写错误会导致看似正确的token被拒绝。

4. 验证IAP的访问权限设置

确保你用来获取id_token的账号(不管是用户账号还是服务账号)已经被添加到IAP的访问列表中,拥有访问该App Engine应用的权限。虽然你能获取到id_token,但如果IAP没有给这个账号授权,也会返回错误(不过错误码可能不同,但还是要排查)。

5. 为什么App Engine实例没被访问到?

IAP是作为前置代理存在的,所有请求必须先通过IAP的认证校验,只有校验通过的请求才会被转发到你的App Engine实例。如果凭证无效,IAP直接返回错误,根本不会把请求发给你的实例,这就是为什么你看不到实例被访问的记录。

快速测试命令

用这个命令测试是否能正常访问你的接口,替换成你的信息:

curl -v -H "Authorization: Bearer $(gcloud auth print-identity-token --audiences=YOUR_IAP_CLIENT_ID)" https://your-app-id.uc.r.appspot.com/your-non-web-endpoint

如果返回200,说明问题解决了;如果还是错误,再检查aud字段和权限设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:15:28