Go中的基本HTTP身份验证

leo*_*sas 48 go basic-authentication

我正在尝试使用下面的代码进行基本的HTTP身份验证,但它会抛出以下错误:

2013/05/21 10:22:58获取mydomain.com:不支持的协议方案""退出状态1

func basicAuth() string {
    var username string = "foo"
    var passwd string = "bar"
    client := &http.Client{}
    req, err := http.NewRequest("GET", "mydomain.com", 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
}
Run Code Online (Sandbox Code Playgroud)

知道我可能做错了吗?

小智 54

潜在的"问题"是,如果您的网站进行任何重定向... Go-lang会在重定向上删除您指定的标题.(我必须做wireshark才能看到这个!你可以通过右击然后"检查元素"然后点击网络标签快速查找chrome.

你需要定义一个重定向函数,重新添加标题.

func basicAuth(username, password string) string {
  auth := username + ":" + password
   return base64.StdEncoding.EncodeToString([]byte(auth))
}

func redirectPolicyFunc(req *http.Request, via []*http.Request) error{
 req.Header.Add("Authorization","Basic " + basicAuth("username1","password123"))
 return nil
}

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 非常有用的提示 - 我自己遇到了同样的问题.在重定向函数中,您可以执行`req.SetBasicAuth("username1","password123")`而不是设置标题本身. (24认同)
  • 但要小心,如果您知道您的端点不执行重定向,则不建议出于安全考虑而实施 (2认同)
  • 或者你可以 `http.NewRequest("GET", "http://user:pass@localhost/", nil)` (2认同)

Rya*_*yan 40

您需要为NewRequest指定协议,例如"http://",请参见此处.

req, err := http.NewRequest("GET", "http://mydomain.com", nil)
Run Code Online (Sandbox Code Playgroud)