81

以下のコードで基本的な 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
}

私が間違っているかもしれないことは何ですか?

4

2 に答える 2

91

潜在的な「落とし穴」は、あなたのウェブサイトがリダイレクトを行うかどうかです... Go-lang は、指定されたヘッダーをリダイレクトにドロップします。(これを見るにはwiresharkをしなければなりませんでした!右クリックして「要素を検査」し、ネットワークタブをクリックすることで、クロムですばやく見つけることができます)

ヘッダーを追加するリダイレクト関数を定義する必要があります。

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)
}
于 2015-07-09T06:06:13.893 に答える