首页  >  文章  >  后端开发  >  为什么 Go 中发生重定向时基本 HTTP 认证会失败?

为什么 Go 中发生重定向时基本 HTTP 认证会失败?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-21 04:46:17328浏览

Why Does Basic HTTP Authentication Fail in Go When Redirects Occur?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn