102 votes

Authentification HTTP basique en Go

J'essaie d'effectuer une authentification HTTP de base avec le code ci-dessous, mais l'erreur suivante se produit :

2013/05/21 10:22:58 Get mydomain.example : schéma de protocole non pris en charge "" statut de sortie 1

func basicAuth() string {
    var username string = "foo"
    var passwd string = "bar"
    client := &http.Client{}
    req, err := http.NewRequest("GET", "mydomain.example", 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 pourrais faire de mal ?

116voto

pmerrell Points 1001

Le problème potentiel est que si votre site web fait des redirections... Go-lang laissera tomber vos en-têtes spécifiés sur les redirections. (J'ai dû utiliser wireshark pour voir cela ! Vous pouvez le découvrir rapidement dans chrome en faisant un clic droit puis "inspecter l'élément" et cliquer sur l'onglet réseau)

vous devrez définir une fonction de redirection qui réintroduira 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)
}

71voto

Ryan Points 778

Vous devez spécifier le protocole pour NewRequest, par exemple "http://", cf. aquí .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X