Flutter WebView请求Header丢失:Cloud Run接收不到Authorization头
解决思路
1. 排查Google Cloud Run层面的请求头处理
- 检查Cloud Run服务的Ingress配置:确认设置为「Allow all traffic」,虽然桌面浏览器能访问,但如果Ingress有特殊限制,可能会影响WebView请求的头传递。
- 查看Cloud Run请求日志:在Google Cloud Console的Cloud Run服务详情页,查看请求的完整日志,确认
Authorization头是否到达Cloud Run入口。如果日志中没有该头,说明是Cloud Run前置环节(如负载均衡、CDN)拦截了,需检查对应服务的头过滤规则,确保允许保留Authorization头。 - 检查CDN/负载均衡配置:如果启用了Cloud CDN或自定义负载均衡,确认是否存在重写或移除
Authorization头的规则,需要在配置中添加允许该头通过的设置。
2. 验证Flask应用的头接收逻辑
- 打印所有请求头排查:在Flask路由中添加代码直接输出全部请求头,查看Cloud Run的应用日志确认是否存在
Authorization头:
如果日志中有该头但业务逻辑未获取到,检查取值方式是否正确(HTTP头不区分大小写,尝试用from flask import request @app.route('/your-path') def your_route(): print(request.headers) # 其他业务逻辑request.headers.get('authorization')代替大小写敏感的取值)。 - 检查CORS中间件配置:如果使用
flask-cors,需确保配置允许携带Authorization头并支持凭证:from flask_cors import CORS app = Flask(__name__) CORS( app, supports_credentials=True, resources={r"/*": { "origins": "*", "allow_headers": ["Authorization"] }} )
3. 确认Flutter WebView的请求头发送逻辑
- 确保所有请求都携带头:部分WebView插件(如
webview_flutter)仅在初始加载时携带自定义头,页面跳转或资源请求时不会自动继承。需通过NavigationDelegate的onNavigationRequest方法,为每个请求重新添加Authorization头:WebView( initialUrl: 'your-cloud-run-url', navigationDelegate: (NavigationRequest request) { final modifiedRequest = request.copyWith( headers: { ...request.headers, 'Authorization': 'Bearer your-token', }, ); return NavigationDecision.navigate; }, // 其他配置 ) - 处理OPTIONS预请求:WebView发送带自定义头的请求前会触发OPTIONS预请求,需确保Flask能正确响应该请求,返回包含
Access-Control-Allow-Headers: Authorization的响应头,否则WebView可能会拦截后续请求或移除头信息。
4. 排查WebView安全策略问题
- 确保HTTPS一致性:WebView(尤其是Android端)会限制混合内容,确保WebView加载的URL和Cloud Run服务均为HTTPS,避免因混合内容导致请求头被过滤。
- 调整WebView安全设置:Android端可测试启用
MIXED_CONTENT_ALWAYS_ALLOW(生产环境不推荐)验证是否是混合内容限制导致;iOS端需检查WKWebViewConfiguration的安全策略,确保允许自定义头的传递。
内容的提问来源于stack exchange,提问作者Mack Raymond
相关产品推荐
相关产品推荐

