Golang API与C#客户端生产环境Authorization Header为空问题求助
我用Golang开发API服务,C#开发客户端,二者通过Bearer Token做身份验证。客户端已添加Authorization请求头,但部署在Google Cloud生产环境后,Golang服务器端获取到的该头为空;本地运行完全正常。试过设置PreAuthenticate属性也没用,求排查方向。
排查方向
- 检查Google Cloud负载均衡/反向代理配置:Google Cloud的HTTP(S)负载均衡可能修改或移除敏感请求头,比如Authorization。确认负载均衡是否开启"保留客户端请求头"配置;如果用Cloud Run,检查服务设置是否允许传递Authorization头(默认保留,但自定义Ingress规则可能例外)。
- 全链路日志验证:在Golang服务中打印所有收到的请求头,确认是否真的没有Authorization头;客户端侧添加请求日志,确保发送的请求确实携带该头(可以用Fiddler或客户端内置日志记录请求详情)。同时查看Google Cloud Logging中的请求日志,确认负载均衡转发给服务的请求是否带该头。
- 排查重定向问题:生产环境可能存在HTTP转HTTPS这类3xx重定向,部分场景下重定向会丢失自定义请求头。确认客户端直接请求HTTPS地址,避免自动重定向;或者修改客户端逻辑,确保重定向时携带Authorization头。
- 调整C#客户端请求头添加方式:
HttpWebRequest对Authorization头有特殊处理,试试改用request.Headers[HttpRequestHeader.Authorization] = $"Bearer {token}"替代Add方法;或者换成HttpClient(它在请求头和重定向处理上更可靠)。 - 检查WAF/防火墙规则:Google Cloud的Cloud Armor或其他WAF服务可能拦截或移除Authorization头,排查是否有相关过滤规则。
- 验证服务端HTTPS/代理配置:如果服务端在Google Cloud上使用HTTPS,确认代理层(如Nginx)是否存在配置错误,导致Authorization头被修改或丢失。
客户端C#代码
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUrl); //request.PreAuthenticate = true; request.ContentType = "application/json"; request.Method = "PUT"; request.Headers.Add("Authorization", $"Bearer {token}"); //request.Accept = "application/json"; using (StreamWriter stream = new StreamWriter(request.GetRequestStream())) { string serialized = JsonConvert.SerializeObject(sync, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd" }); stream.Write(serialized); } try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { if (((int)response.StatusCode) < 200 || ((int)response.StatusCode) >= 300) { throw new Exception("error"); } } } catch (WebException wex) { var body = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); throw new HttpRequestException(body); }
Golang服务端代码
return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() authHeader := r.Header.Get("Authorization") _, err := parseAuthHeader(ctx, verifier, authHeader) if err != nil { render.Render(w, r, httperr.ErrUnauthorized(err.Error())) return } next.ServeHTTP(w, r) }) }
内容的提问来源于stack exchange,提问作者Emaborsa
相关产品推荐
相关产品推荐

