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

Golang API与C#客户端生产环境Authorization Header为空问题求助

生产环境Authorization请求头丢失排查思路(Golang服务+C#客户端)

我用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:22:33