一尘不染

Go 中的基本 HTTP 身份验证

go

我正在尝试使用下面的代码进行基本的 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
}

知道我可能做错了什么吗?


阅读 142

收藏
2021-12-17

共2个答案

一尘不染

潜在的“问题”是您的网站是否进行了任何重定向……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)
}
2021-12-17
一尘不染

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

req, err := http.NewRequest("GET", "http://mydomain.com", nil)
2021-12-17