web-dev-qa-db-fra.com

Authentification HTTP de base dans Go

J'essaie de faire l'authentification HTTP de base avec le code ci-dessous, mais cela génère l'erreur suivante:

2013/05/21 10:22:58 Obtenez mydomain.com: schéma de protocole non pris en charge "" état de sortie 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
}

Une idée de ce que je fais mal?

43
leonsas

Vous devez spécifier le protocole pour NewRequest, par exemple "http: //", voir ici .

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

le "piège" potentiel est que votre site Web effectue des redirections ... Go-lang supprimera vos en-têtes spécifiés sur les redirections. (J'ai dû faire du wirehark pour voir ça! Vous pouvez rapidement le découvrir dans chrome en faisant un clic droit puis "inspecter l'élément" et cliquer sur l'onglet réseau)

vous voudrez définir une fonction de redirection qui ajoute l'en-tête.

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)
}
50
pmerrell