Firebase Hosting转发至Cloud Run时Authorization头丢失问题排查
iOS客户端请求Cloudflare托管的域名,经Firebase Hosting转发至GCP Cloud Run服务,但Cloud Run上的Golang后端在获取Authorization请求头时出现概率性丢失的情况——部分请求能正常获取,部分则无法获取。结合下方Firebase Hosting的firebase.json配置及后端获取头信息的代码片段,请问是否是Firebase无法转发Authorization头导致该问题?
Firebase Hosting 配置
{ "target": "xxx", "public": "dist", "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], "rewrites": [ { "source": "/api/:path*", "run": { "serviceId": "xxx", "region": "asia-northeast1" } }, { "source": "**", "destination": "/index.html" } ] }
Golang 后端代码片段
func Authentication(db *gorm.DB, firebaseClient firebase.Client) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { var ( idToken = r.Header.Get("Authorization") user = &models.User{} language = r.Header.Get("Accept-Language") ) // 检查Authorization头是否为空 if idToken == "" { w.WriteHeader(http.StatusUnauthorized) logger.MethodError(r.Context(), "svc.idToken.first.null", logrus.Fields{"err": "id token is null", "header": r.Header}) helpers.RenderFailureJSON(w, http.StatusUnauthorized, errcode.ErrorNotLogin.Msg(language)) return } r = helpers.SetCurrentUser(r, user) next.ServeHTTP(w, r) } return http.HandlerFunc(fn) } }
Firebase Hosting默认会转发Authorization请求头,你的firebase.json配置没有禁用该头的转发逻辑,所以单纯Firebase配置不是导致Authorization头概率性丢失的原因。需要从以下几个方向排查问题:
Cloudflare层面的干扰:
Cloudflare的缓存规则如果覆盖了/api路径,可能会对部分请求进行缓存,或者WAF安全规则在特定场景下移除了Authorization头。建议检查Cloudflare的缓存策略、WAF规则,确认是否存在修改或丢弃该请求头的配置。iOS客户端的请求异常:
概率性问题大概率和客户端逻辑有关,比如网络波动导致请求重发时未重新携带Authorization头,或者token刷新流程存在漏洞,导致部分请求漏带头信息。可以在客户端添加请求日志,验证每次请求是否都正确携带了该头。Firebase Hosting边缘节点偶发异常:
虽然概率极低,但Firebase边缘节点可能出现临时故障导致请求头丢失。可以尝试重新部署Firebase Hosting配置,同时查看Firebase的请求日志,确认转发到Cloud Run的请求是否携带了Authorization头。Golang后端的头处理逻辑问题:
检查Authentication中间件之前是否有其他中间件修改或移除了Authorization头。另外,原代码中日志输出的hedaer是拼写错误,建议修正后查看完整的请求头日志——如果日志显示请求到达后端时确实没有Authorization头,说明问题出在转发或客户端;如果日志中存在该头但代码获取不到,可能是后端解析逻辑有问题。
内容的提问来源于Stack Exchange,提问作者Nicholas

