gpt4 book ai didi

authentication - 具有自定义身份验证的 Golang 反向代理

转载 作者:IT王子 更新时间:2023-10-29 01:15:02 29 4
gpt4 key购买 nike

在将请求代理到远程服务器之前,我试图通过调用 REST api 来验证用户身份。但是,我发现如果我在代理到远程服务器之前进行 api 调用,请求将失败并出现以下错误:

http: proxy error: http: ContentLength=139 with Body length 0.

如果我在代理到远程服务器之前删除 api 调用,请求可以通过并返回正确的响应。

我的中间件如下:

func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// the api call to external auth server
user_id, err := authenticate(r.FormValue("username"), r.FormValue("password"))
if err != nil {
http.Error(w, err.Error(), 401)
return
}
next.ServeHTTP(w, r)
})
}

我的反向代理如下:

func NewReverseProxy(target *url.URL) *httputil.ReverseProxy {
director := func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.URL.Path = target.Path
targetQuery := target.RawQuery
if targetQuery == "" || req.URL.RawQuery == "" {
req.URL.RawQuery = targetQuery + req.URL.RawQuery
} else {
req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
}
if _, ok := req.Header["User-Agent"]; !ok {
// explicitly disable User-Agent so it's not set to default value
req.Header.Set("User-Agent", "")
}
}
return &httputil.ReverseProxy{Director: director}
}

我正在使用 Chi 进行路由

r.Use(AuthMiddleware)
r.Post("/", NewReverseProxy(targets).ServeHTTP)

这个实现有什么问题?

最佳答案

如果您不再关心正文,您可以将请求的内容长度设置为 0,以反射(reflect)正文的当前状态:

func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// the api call to external auth server
user_id, err := authenticate(r.FormValue("username"), r.FormValue("password"))
if err != nil {
http.Error(w, err.Error(), 401)
return
}
r.ContentLength = 0
next.ServeHTTP(w, r)
})
}

关于authentication - 具有自定义身份验证的 Golang 反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42650930/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com