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

Cloud Run是否会剥离/篡改前端请求头?鉴权异常求助

问题描述
  • Cloud Run API服务Ingress设置为all,需鉴权
  • Angular前端通过OIDC获取企业谷歌邮箱的idToken,作为Bearer令牌放入Authorization请求头,核心代码如下:
const idToken = this.authService.getIDToken(); // 从OIDC获取
const headers = new HttpHeaders().set('Authorization', `Bearer ${idToken}`);

return this.http.get(
   'cloudRunURL',
   { headers, withCredentials: true }
).pipe(// 其他逻辑)
  • curl测试idToken有效,但前端请求出现两个问题:
    • 浏览器控制台报跨域错误:
      Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://foobar.run.app. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 403.
      
    • Cloud Run日志显示未认证:
      "The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header. Read more at https://cloud.google.com/run/docs/securing/authenticating Additional troubleshooting documentation can be found at: https://cloud.google.com/run/docs/troubleshooting#unauthorized-client"
      
  • 已确认前端输出的idToken正确,请求头确实携带Bearer令牌,怀疑Cloud Run的隐形负载均衡篡改/剥离请求头。
排查与解决方案

1. 优先处理CORS问题(浏览器拦截的直接原因)

Cloud Run的鉴权检查会在CORS预检请求(OPTIONS)之前执行,而预检请求不会携带Authorization头,因此直接返回403,触发浏览器的CORS错误。需要:

  • 在Cloud Run应用中配置CORS规则,允许前端域名的跨域请求,并跳过OPTIONS请求的鉴权:
    • 若为自定义服务(如Node.js/Java),添加CORS中间件:
      以Node.js(Express)为例:
      const cors = require('cors');
      app.use(cors({
        origin: '你的前端域名',
        credentials: true,
        allowedHeaders: ['Authorization', 'Content-Type'],
        methods: ['GET', 'POST', 'OPTIONS']
      }));
      // 直接响应OPTIONS请求
      app.options('*', cors());
      
    • 若支持托管CORS配置,可通过服务环境变量或部署参数设置,比如指定CORS_ALLOW_ORIGIN为前端域名。

2. 验证Authorization头是否到达Cloud Run

前端控制台显示头存在,但可能传输中丢失:

  • 在Cloud Run服务代码中添加日志,打印所有请求头,确认Authorization头是否存在:
    Node.js示例:
    app.use((req, res, next) => {
      console.log('Received headers:', req.headers);
      next();
    });
    
  • 检查是否有中间件/反向代理(如配置了Cloud CDN)设置了剥离Authorization头的规则,确保无此类配置。

3. 确认idToken的受众(aud)匹配

curl测试有效但前端请求无效,可能是idToken受众不匹配:

  • 解码idToken,检查aud字段是否为Cloud Run服务URL(如https://foobar.run.app)或GCP项目客户端ID;若不匹配,在OIDC获取idToken时指定正确的aud参数。
  • 在Angular的Auth配置中添加audience: '你的Cloud Run服务URL',确保请求idToken时携带正确受众。

4. 检查withCredentials的配置

前端设置了withCredentials: true,要求CORS响应满足两个条件:

  • Access-Control-Allow-Credentials设为true
  • Access-Control-Allow-Origin不能是通配符*,必须是具体的前端域名
    确保CORS配置完全符合以上要求。

5. 排除Cloud Run负载均衡的问题

Cloud Run默认不会剥离Authorization头,可通过以下方式验证:

  • 执行gcloud run services describe [服务名]查看服务配置,确认无特殊头修改规则
  • 用Postman模拟前端请求(携带Origin和Authorization头),验证是否能成功,排除浏览器的特殊限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:20:08