2013-05-21 10 views
18

Ich versuche, unten mit dem Code grundlegendes HTTP Auth zu tun, aber es wird die folgenden Fehler werfen:Grund HTTP Auth in Go

2013/05/21 10:22:58 Get mydomain.com: nicht unterstütztes Protokollschema "" Exit-Status 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 
} 

Jede Idee, was ich falsch machen kann?

Antwort

20

Sie müssen das Protokoll für NewRequest angeben, z. "http: //", siehe here.

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

das Potential ‚Gotcha‘ ist, wenn Ihre Website alle Umleitungen tut ... Go-lang werden Ihre angegebenen Header auf den Umleitungen fallen. (Ich musste drageshark, um dies zu sehen! Sie können schnell herausfinden in Chrom durch Rechtsklick dann "Inspect-Element" und klicken Sie auf Netzwerk Registerkarte)

Sie wollen eine Redirect-Funktion definieren, die den Header zurück fügt .

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) 
} 
+7

Sehr nützlicher Tipp - lief selbst in das gleiche Problem. In der Redirect-Funktion können Sie 'req.SetBasicAuth (" username1 "," password123 ")' anstelle des Headers selbst setzen. – mjturner