Go 中的基本 HTTP 身份验证处理
在 Go 中实现基本 HTTP 身份验证时,可能会出现一些意想不到的挑战。本文深入探讨了尝试实现基本 HTTP 身份验证时遇到的常见问题。
问题:执行以下代码时遇到“不支持的协议方案”错误:
func basicAuth() string { var username string = "foo" var passwd string = "bar" client := &http.Client{} req, err := http.NewRequest("GET", "mydomain.example", nil) req.SetBasicAuth(username, passwd) resp, err := client.Do(req) if err != nil{ log.Fatal(err) } bodyText, err := ioutil.ReadAll(resp.Body) s := string(bodyText) return s }
原因:当发生重定向时,Go-lang 会丢弃任何指定的标头,包括为基本身份验证设置的 Authorization 标头。
解决方案:纠正针对这个问题,可以实现一个自定义的重定向策略函数:
func redirectPolicyFunc(req *http.Request, via []*http.Request) error { req.Header.Add("Authorization", "Basic "+basicAuth("username1", "password123")) return nil }
此函数确保在重定向期间添加回 Authorization 标头,有效保留身份验证凭证。
实现:
func main() { client := &http.Client{ Jar: cookieJar, CheckRedirect: redirectPolicyFunc, } req, err := http.NewRequest("GET", "http://localhost/", nil) req.Header.Add("Authorization", "Basic "+basicAuth("username1", "password123")) resp, err := client.Do(req) }
通过利用重定向策略功能,指定的标头(包括用于基本身份验证的授权标头)将在整个重定向过程中持续存在,确保与目标服务器成功进行身份验证。
以上是为什么 Go 中发生重定向时基本 HTTP 认证会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!